C++中的内存泄漏(通过new + delete)

joe*_*moe 6 c++ memory-leaks

为了使应用程序没有内存泄漏,C++项目中的new数量是否与delete的数量相匹配?

CB *_*ley 19

如果您的意思是delete在源代码中需要与实例相同数量的实例new,则不需要.您可以new在多个位置编辑对象,但所有这些对象都delete使用相同的代码行.实际上这是一个常见的习语.

不同类型的智能指针通常new在用户代码中的许多地方采用许多不同的对象,并且delete它们来自库代码中的单个位置.

编辑

从技术上讲,每个成功的内存分配调用都需要与从原始分配调用中获取返回指针的dellocation调用匹配.

大多数new表达式导致调用operator new分配内存并在新分配的内存中构造对象.使用delete表达式会破坏对象并导致调用operator delete应释放已分配内存的对象.

有一些新的表达式可以在预先分配的内存(放置new)中构造对象.这些不应与删除表达式匹配,但可能需要以与原始分配对应的方式释放预分配的内存.


Kla*_*aim 17

如果你的意思是"在源代码中",那么不是.

看到这段代码:

int main()
{
    char* buffer = 0; 


    for( int i = 0; i < 42; ++i )
    {
        buffer = new char[1024];
    }

    delete [] buffer; 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

1个新的,1个删除,((42-1)*1024)字节的内存泄露.

如果你的意思是"在运行时新建和删除调用",那么是.每个使用new获取的内存都必须通过delete发布:

int main()
{
    std::vector<char*> bufferList; // or nullptr or NULL whatever


    for( int i = 0; i < 42; ++i )
    {
        bufferList.push_back( new char[1024] );
    }

    for( int i = 0; i < bufferList.size(); ++i )
    {
        delete [] bufferList[i]; 
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在执行时,我们为每个新执行的执行删除<=>没有泄漏.


小智 7

是.必须通过删除来匹配每个新内容.

但是,删除通常对您隐藏 - 例如:

{
  std::auto_ptr p( new Foo );
}
Run Code Online (Sandbox Code Playgroud)

这里有一个新的,但删除(在块的末尾自动发生)隐藏在std :: auto_ptr实现中.