强制在C++中删除std :: shared_ptr

Rez*_*our 2 c++ pointers smart-pointers c++11 c++17

根据本文的第一个答案:显式删除shared_ptr

是否可以强制删除std :: shared_ptr及其管理的对象,如下面的代码?

do {
    ptr.reset();
} while (!ptr.unique());

ptr.reset();  // To eliminate the last reference
Run Code Online (Sandbox Code Playgroud)

从技术上讲,std::shared_ptr::reset如果指针的引用次数超过1 ,则应该尝试调用,除非它达到1.有什么想法吗?

Bar*_*rry 10

这段代码没有任何意义.

重置后ptr,它不再管理对象.如果ptr是唯一的shared_ptr共享所有权,那么你就完成了.如果不是......那么,你无法访问所有其他的那些.呼吁reset()脱离shared_ptr实际上是一种努力 - 没有什么可以重置的了.

想象一个简单的场景:

std::shared_ptr<int> a = std::make_shared<int>(42);
std::shared_ptr<int> b = a; // a and b are sharing ownership of an int

do {
    a.reset();
} while (!a.unique());
Run Code Online (Sandbox Code Playgroud)

重置的唯一方法b是重置b- 此代码a仅重置,无法重置b.

另请注意,unique()在C++ 17 中已弃用,并且完全在C++ 20中删除.但即使你使用它use_count(),一旦你这样做a.reset(),a.use_count()将等于0因为a不再指向一个对象.

  • @RezaHajianpour由`shared_ptr`管理的每个对象也都有一个为其分配的独立控制块,该对象的每个`shared_ptr`和`weak_ptr`都可以参考.它包含计数器. (2认同)

Gal*_*lik 5

不,这是不可能的(或不可取的).共享指针的要点是,如果你有一个,你可以保证它指向的对象(如果有的话)不会从你的下面消失,直到(至少)你完成它.

调用ptr.reset()只会减少引用计数1- 作为共享指针的引用.它永远不会影响共享对象的其他共享指针的其他引用.