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个字节).
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.
假设您创建了一个类,该类继承了一些没有虚拟析构函数的其他类。如果指向这个类的指针的类型不是最派生的类(如果您使用抽象工厂,这通常会发生),那么只会调用指针类型的析构函数,并且您一直希望在最派生的类中可以自由执行任何操作类析构函数会泄漏。
这是一个非常常见的错误,有时很难看到。
无论如何,如果你想避免 C++ 的内存泄漏,请遵循以下规则: