从内部功能中删除Smart_PTR



是否有任何方法可以从函数内部销毁std::shared_ptr?在下面的示例中,如果我将sptr设置为main()中的nullptr,则它将"破坏"对象,因此将其称为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)

如果要在 Delete函数中拆除shared_ptr。我想使用std::move是更好的选择。

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

并使用

调用该功能
Delete(std::move(sptr));

使用std::move转移资源的所有权,此通话后main内无法进一步使用。

相关内容

  • 没有找到相关文章

最新更新