Некоторые потенциальные проблемы, которые могут возникнуть при неправильном использовании std::enablesharedfrom_this:
- Исключение std::badweakptr. www.nextptr.com en.cppreference.com Оно возникает, когда вызывается sharedfromthis для объекта, который не управляется sharedptr. www.nextptr.com en.cppreference.com Ещё одно условие — вызов sharedfromthis в конструкторе, так как встроенный weakthis ещё не инициализирован. www.nextptr.com Третий случай — вызов sharedfromthis для класса, который не публично наследует std::enablesharedfromthis. www.nextptr.com Частное (или защищённое) наследование предотвращает инициализацию weakthis, и это может пройти незамеченным без предупреждений компилятора. www.nextptr.com
- Проблема перекрёстных ссылок. scrutator.me Она может возникнуть, если указатель на родителя сделать объектом sharedptr. scrutator.me В таком случае потомок никогда не будет удалён, поскольку он сам содержит sharedptr своего родителя. scrutator.me
Чтобы избежать проблем, необходимо соблюдать ограничения при использовании std::enablesharedfromthis: объекты классов, наследующих enablesharedfromthis и использующих метод sharedfromthis, должны быть созданы как sharedptr изначально. scrutator.me Также метод sharedfromthis не может быть использован в конструкторе класса, наследующего enablesharedfromthis. scrutator.me