当unique_ptr设置为nullptr时,谁和何时删除对象



我使用了一个类,其中unique_ptr指向对象,并在运行时将其异步设置为nullptr,然后另一个方法可能调用make_unique并将提到的指针设置为这个新对象。

void Class0::f0()
{
mPtr = std::make_unique<Class1>();
}
void Class0::f1(SomeType param)
{
mPtr->doWork(param);
mPtr      = nullptr; 
}
//f1 called after f0 asynchroniously, any number of times

谁以及何时删除了未被明确删除的前一个?unique_ptr仍然是活动的,因为它是一个类字段,所以它的析构函数永远不会被调用,但是unique_ptr可以设置为nullptr,并且make_unique可以被多次调用。我几乎可以肯定它会导致内存泄漏,并且必须首先显式调用mPtr.reset()。但是我在visual studio c++中做了一个小测试,没有导致泄漏。

void f()
{
std::unique_ptr<std::vector<std::vector<int>>> ptr = std::make_unique<std::vector<std::vector<int>>>(100000);
ptr = nullptr;
f();
}

递归只检查有和没有PTR的内存使用情况= nullptr;我用- 0尝试过wsl++,结果完全相同。有人能解释一下吗?

谁以及何时删除未明确删除的先前内容?

不显式删除由智能指针管理的对象是使用智能指针的首要原因。要正确管理对象的生命周期,需要做的不仅仅是在unique_ptr的析构函数中删除对象(参见什么是三的规则?)假设智能指针正确地管理生命周期是相当安全的,除非你做了一些奇怪的事情。

这里ptr = nullptr;是重载(3)从cppreference/unique_ptr/operator=:

unique_ptr& operator=( std::nullptr_t ) noexcept;     (3)     

实际上与调用reset()相同。

reset():

void reset( pointer ptr = pointer() ) noexcept;

替换托管对象。

给定current_ptr,由*this管理的指针,按顺序执行以下操作:

  • 保存当前指针的副本old_ptr = current_ptr
  • 用参数current_ptr = ptr覆盖当前指针
  • 如果旧指针不为空,删除以前的管理对象
    if(old_ptr) get_deleter()(old_ptr)

最新更新