从内部函数中删除 smart_ptr

remove smart_ptr from inside function

有什么方法可以从函数中销毁 std::shared_ptr 吗?在下面的示例中,如果我在 main() 中将 sptr 设置为 nullptr 它 "destroys" 对象因此调用它 Print() 失败。但是,在 Delete() 函数中这样做并不能做到这一点。猜测它会在传入时增加它的引用计数。我明白了,但是有什么方法可以覆盖它并减少 Delete() 内的引用计数所以 obj = nullptr 在这种情况下会破坏它吗?

我知道这通常不是你想要做的,但在这种情况下,外部脚本语言需要能够调用一个函数来实际销毁指向的对象,所以有一个 Delete(obj) 会很理想。

#include <memory>
#include <string>
#include <iostream>

using namespace std;

class Test{
private:
    string name;
public:
    Test(string _name) { name = _name; }
    void Print() const { cout << name; }
};

void Delete(std::shared_ptr<Test> obj)
{
    obj = nullptr;
}

int main(){
    shared_ptr<Test> sptr(new Test("Test"));

    Delete(sptr);
    //sptr = nullptr;

    sptr.get()->Print();
}

按值传递 void Delete(shared_ptr<Test> obj) 进行复制,这会增加 sptr 的计数器,因此 nullptr 的赋值会减少计数器,但不会破坏底层对象。您可以通过引用传递 void Delete(shared_ptr<Test>& obj).

如果你想销毁 shared_ptr 里面的 Delete 函数。我想使用 std::move 是更好的选择。

void Delete(shared_ptr<Test>&& obj) //rvalue reference
{
    obj = nullptr;
}

并使用

调用函数
Delete(std::move(sptr));

使用 std::move 转移资源的所有权,在此调用后不能在 main 内进一步使用。