boost::shared_ptr
能解决原始指针问题吗?
Base* p = new Base();
shared_ptr <Base> sp(p);
shared_ptr <Base> sq(p);
两个shared_ptr
的引用计数都为1,所以原始指针是有问题的。
boost::shared_ptr
也有这个问题吗?
我听说boost::shared_ptr
没有问题,那么它是如何解决的呢?
boost::shared_ptr
不能解决这个问题。
问题出在你的代码中,所以你需要自己解决。
最佳解决方案是确保在使用new
:创建对象时始终立即初始化智能指针
shared_ptr <Base> sp(new Base());
现在没有原始指针,所以没有问题。
更好:
shared_ptr<Base> sp = make_shared<Base>();
你听错了。这对于boost或std shared_ptr
来说肯定不起作用。
所提供的是一个shared_from_this构造。您从一个基类继承,这个基类可以找到shared_ptr引用(并在您第一次采用指针时设置它)。然后你可以从一个原始指针中获得一个新的共享:
p->shared_from_this();
如果你这样称呼它,尽管它已经被一个共享指针采用了,或者它会做非常可怕的事情,并在所有尴尬的地方触动你。通过必须调用的create
函数而不是构造函数来强制执行它是很划算的。这样可以确保没有人创建一个不在shared_ptr
中的函数并调用该函数。
我真的很努力地避免不得不使用这种结构。如果你非常确定你的类型必须在共享所有权结构中,那么就让它使用侵入式指针。一个有原始指针问题的侵入式指针将是一件非常愚蠢的事情。。。我不知道有哪个能。你的代码可以和他们一起工作。