从内部函数中删除smart_ptr

时间:2018-03-28 12:48:23

标签: c++ smart-pointers

有没有办法从函数中销毁std::shared_ptr?在以下示例中,如果我在sptr中将nullptr设置为main(),则#34;销毁"调用它的对象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();
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果要解冻shared_ptr函数内的Delete。我想使用std::move是更好的选择。

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

并使用

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

使用std::move转移资源的所有权,并且在此次调用后无法在main内进一步使用。