唯一指针内存泄漏

unique pointer memory leak

我想知道是否有人可以帮助我解决我对唯一指针的一些困惑。考虑以下代码:

// some class "complex" defined here

int main()
{
    while(1) 
    {
        unique_ptr<complex> p(new complex[256]);
        p.reset();
    }
    return 1;
}

现在据我了解,当我在唯一指针上调用 reset() 时,它应该删除其原始指针所引用的对象。在这种情况下,该对象恰好是创建的 256 个中第一个 complex 类型的对象。因为那是 new complex[256] 所做的,对吗?它只是 returns 指向数组中第一个对象的指针(当然,它也创建了)?所以剩下的256个对象应该保持不变。

按照该逻辑,无限循环应该会造成内存泄漏,但并没有发生。我正在使用 MS Visual Studio 2013。

我错过了什么?如果有人能告诉我这里发生的事情并确认或反对我的猜想,我将不胜感激

您的 unique_ptr 将在其超出范围时在其拥有的指针上调用 delete。因此,您使用 delete 而不是 delete[] 来删除由 new[] 分配的内存。这是未定义的行为,尝试进一步解释为什么您的代码没有按照您期望的方式运行几乎毫无意义。

但是可能发生的事情是在该指针上调用 delete 意味着只有数组中的第一个 complex 对象被销毁(意味着它的析构函数被调用)。剩下的255个对象不会调用析构函数,但是整个数组占用的内存还是被释放了

我认为你的期望是你的程序使用越来越多的内存,最后在 new 分配失败时死掉,但是如果数组占用的内存正在被释放,那永远不会发生.


处理带有 unique_ptr 的数组的正确方法是对数组类型使用偏特化

unique_ptr<complex[]> p(new complex[256]);
//                ^^

或者,如果您的标准库实现了 std::make_unique (C++14),则使用

auto p = std::make_unique<complex[]>(256);