gar*_*h0p 23 c++ boost shared-ptr boost-smart-ptr
这里有一个简单的问题:您是否可以明确删除boost::shared_ptr自己?你应该吗?
澄清,我不是说删除指针所持的指针shared_ptr.我的意思是实际的shared_ptr.我知道大多数人建议不要这样做,所以我只是想知道是否可以明确地做到这一点.
Pra*_*ian 27
你的问题不明确.如果你已经shared_ptr动态分配了一个,那么你当然可以随时使用delete它.
但是如果你问你是否被允许删除由该管理的任何对象shared_ptr,那么答案是......这取决于.如果shared_ptr::unique返回true,则调用shared_ptr::reset将删除托管对象.但是,如果shared_ptr::unique返回false,则表示有多个shared_ptr共享该对象的所有权.在这种情况下,调用reset只会导致引用计数减1,当最后一个shared_ptr管理该对象超出范围或本身时,将发生对象的实际删除reset.
编辑:
编辑后,似乎你要求删除动态分配shared_ptr.像这样的东西:
auto sp = new boost::shared_ptr<int>( new int(42) );
// do something with sp
delete sp;
Run Code Online (Sandbox Code Playgroud)
这是允许的,并且将按预期工作,尽管这将是一个不寻常的用例.唯一需要注意的是,如果在分配和删除之间sp创建另一个shared_ptr共享对象所有权,则删除sp不会导致删除对象,这只会在对象的引用计数变为0时发生.
[编辑:你可以delete使用shared_ptrif和only,如果它是使用的new,与任何其他类型相同.我想不出为什么你会创建一个shared_ptr具有new,但没有什么能阻止你.]
好吧,你可以写delete ptr.get();.
这样做几乎不可避免地导致未定义的行为,或者当其他共享所有者使用它们shared_ptr来访问现在删除的对象时,或者对象的最后一个shared_ptr被销毁,并且对象再次被删除.
所以不,你不应该.
目的shared_ptr是管理一个没有"人"有权删除的对象,因为可能有其他人共享所有权.所以你不应该也想要.
您不能将其引用计数强制为零,不。
考虑一下要实现这一点需要什么。您需要去每个使用shared_ptr的地方并清除它。
如果你确实强制删除共享指针并将其设置为 NULL,那么它就像一个weak_ptr。然而,代码中所有使用该shared_ptr的地方都没有准备好,并且期望持有一个有效的指针。他们没有理由检查 NULL,因此这些代码会崩溃。