在 C++ 中强制删除 std::shared_ptr
Force deleting std::shared_ptr in C++
根据本文第一个回答:Explicitly deleting a shared_ptr
是否可以像下面的代码那样强制删除一个std::shared_ptr和它管理的对象?
do {
ptr.reset();
} while (!ptr.unique());
ptr.reset(); // To eliminate the last reference
从技术上讲,如果指针的引用计数超过 1,这应该尝试调用 std::shared_ptr::reset
,除非它达到 1。对此有什么想法吗?
此代码没有任何意义。
重置 ptr
后,它不再管理对象。如果 ptr
是唯一的 shared_ptr
共享所有权,那么您就完成了。如果不是……那么,您将无权访问所有其他那些。在未参与的 shared_ptr
上调用 reset()
实际上是一个 noop - 没有更多要重置的东西。
想象一个简单的场景:
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());
重置 b
的唯一方法是重置 b
- 此代码只会重置 a
,它不可能达到 b
。
另请注意,unique()
在 C++17 中已弃用,并在 C++20 中完全删除。但是,即使您使用 use_count()
代替,一旦您使用 a.reset()
,a.use_count()
将等于 0
,因为 a
不再指向对象。
不,这是不可能的(或不可取的)。共享指针的要点是,如果你有一个共享指针,你可以保证它指向的对象(如果有的话)不会从你下面消失,直到(至少)你完成它.
调用 ptr.reset()
只会减少引用计数 1
- 作为您的共享指针的引用。它永远不会影响来自共享您的对象的其他共享指针的其他引用。
根据本文第一个回答:Explicitly deleting a shared_ptr
是否可以像下面的代码那样强制删除一个std::shared_ptr和它管理的对象?
do {
ptr.reset();
} while (!ptr.unique());
ptr.reset(); // To eliminate the last reference
从技术上讲,如果指针的引用计数超过 1,这应该尝试调用 std::shared_ptr::reset
,除非它达到 1。对此有什么想法吗?
此代码没有任何意义。
重置 ptr
后,它不再管理对象。如果 ptr
是唯一的 shared_ptr
共享所有权,那么您就完成了。如果不是……那么,您将无权访问所有其他那些。在未参与的 shared_ptr
上调用 reset()
实际上是一个 noop - 没有更多要重置的东西。
想象一个简单的场景:
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());
重置 b
的唯一方法是重置 b
- 此代码只会重置 a
,它不可能达到 b
。
另请注意,unique()
在 C++17 中已弃用,并在 C++20 中完全删除。但是,即使您使用 use_count()
代替,一旦您使用 a.reset()
,a.use_count()
将等于 0
,因为 a
不再指向对象。
不,这是不可能的(或不可取的)。共享指针的要点是,如果你有一个共享指针,你可以保证它指向的对象(如果有的话)不会从你下面消失,直到(至少)你完成它.
调用 ptr.reset()
只会减少引用计数 1
- 作为您的共享指针的引用。它永远不会影响来自共享您的对象的其他共享指针的其他引用。