C C++中内存泄漏的原因

ash*_*sh2 7 c c++ memory-management

C C++中内存泄漏的原因是什么(除了通常分配内存而忘记解除分配内存)

wat*_*180 17

如果在分配和释放之间引发异常,则会发生内存泄漏.

void f1() {
    int* ptr = new int;

    // do something which may throw an exception

    // we never get here if an exception is thrown
    delete ptr;
}
Run Code Online (Sandbox Code Playgroud)

每次f1以异常终止时,都会泄漏4个字节(假设int是4个字节).

  • ...智能指针比"int*"(没有析构函数)之类的原始指针更"智能"的原因之一:http://stackoverflow.com/questions/106508/what-is-a-smart-pointer -and-时,应-我用一 (3认同)

Cam*_*Cam 14

当你分配的内存内存泄漏造成的,还没有释放它,你将永远无法释放它,因为你不能访问它.

例如,以下代码导致内存泄漏大小sizeof(int):

int * a = malloc(sizeof(int)); //allocate memory
a = 0; //this will cause a memory leak
Run Code Online (Sandbox Code Playgroud)

这会造成内存泄漏,因为现在我们永远无法释放为其分配的内存a.


lda*_*v1s 6

如果不释放某些其他资源(如不在FILE*或其他库句柄上调用fclose),也可能会泄漏内存,因为它们可以分配程序无法直接访问的内存缓冲区.


Rap*_*ael 5

假设您创建了一个类,该类继承了一些没有虚拟析构函数的其他类。如果指向这个类的指针的类型不是最派生的类(如果您使用抽象工厂,这通常会发生),那么只会调用指针类型的析构函数,并且您一直希望在最派生的类中可以自由执行任何操作类析构函数会泄漏。

这是一个非常常见的错误,有时很难看到。

无论如何,如果你想避免 C++ 的内存泄漏,请遵循以下规则:

  • 更喜欢传递引用而不是指针
  • 尽可能使用智能指针(请参阅:shared_ptr