我使用了一个类,其中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)
。