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不再指向一个对象.
不,这是不可能的(或不可取的).共享指针的要点是,如果你有一个,你可以保证它指向的对象(如果有的话)不会从你的下面消失,直到(至少)你完成它.
调用ptr.reset()只会减少引用计数1- 作为共享指针的引用.它永远不会影响共享对象的其他共享指针的其他引用.
| 归档时间: |
|
| 查看次数: |
946 次 |
| 最近记录: |