独特的指针内存泄漏

Mut*_*key 2 c++ new-operator unique-ptr visual-c++ c++11

我想知道是否有人可以帮我解决一些与独特指针混淆的问题.请考虑以下代码:

// some class "complex" defined here

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

根据我的理解,当我调用reset()唯一指针时,它应该删除其原始指针所引用的对象.在这种情况下,对象碰巧是complex256个创建的第一个类型的对象.因为那是什么new complex[256],我是对的吗?它只是返回一个指向数组中第一个对象的指针(它当然也会创建)?所以256个对象的其余部分应保持不变.

遵循该逻辑,无限循环应该创建内存泄漏,但这不会发生.我正在使用MS Visual Studio 2013.

我错过了什么?如果有人能填写我在这里发生的事情并确认或不赞成我的推测,我将非常感激

Pra*_*ian 10

当它超出范围时,你unique_ptr将调用delete它拥有的指针.所以你要删除new[]使用delete而不是使用分配的内存delete[].这是未定义的行为,并且试图进一步推断为什么你的代码没有按照你期望的方式行事,这几乎是毫无意义的.

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

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


使用a处理数组的正确方法unique_ptr是使用数组类型的部分特化

unique_ptr<complex[]> p(new complex[256]);
//                ^^
Run Code Online (Sandbox Code Playgroud)

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

auto p = std::make_unique<complex[]>(256);
Run Code Online (Sandbox Code Playgroud)

  • 避免使用`new`并使用`make_unique`可以避免这种错误:`auto p = std :: make_unique <complex []>(256);` (5认同)