在 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 - 作为您的共享指针的引用。它永远不会影响来自共享您的对象的其他共享指针的其他引用。