除了通常的分配内存后忘记释放之外,C和C++中出现内存泄漏的原因是什么?
如果在分配内存和释放内存之间抛出异常,就会发生内存泄漏。
void f1() {
int* ptr = new int;
// do something which may throw an exception
// we never get here if an exception is thrown
delete ptr;
}
每次f1由于异常而终止时,将泄漏4个字节(假设int为4个字节)。
int *
)更“智能”的原因之一是,智能指针有析构函数可以在对象不再需要时自动释放内存。原始指针没有析构函数,需要手动管理内存,容易出现内存泄漏和悬空指针等问题。参考链接:https://dev59.com/GHVD5IYBdhLWcg3wDXF3 - HostileFork says dont trust SE内存泄漏是在你分配了内存后,还没有释放它,同时你将永远无法释放它,因为你不能再访问它。
例如,下面的代码会导致大小为sizeof(int)
的内存泄漏:
int * a = malloc(sizeof(int)); //allocate memory
a = 0; //this will cause a memory leak
这会导致内存泄漏,因为现在我们将永远无法释放为a
分配的内存。
当你没有释放一些其他资源时,例如没有在FILE*或其他库句柄上调用fclose,也可能会泄漏内存,因为它们可以分配对你的程序不直接可访问的内存缓冲区。
shared_ptr
,它有时很有用,但还有更好的智能指针/容器适合日常使用。它肯定应该是最后的选择。 - Matthieu M.如果没有delete
的new
,没有delete[]
的new[]
,没有free
的malloc
,将会导致内存泄漏。
说真的,还有什么需要解释的吗?
除了您提到的原因外,内存泄漏没有其他原因。
delete
(尽管在代码中写下了)。 - Matthieu M.我很惊讶没有人提到内存损坏。
我记得有一个情况,我们实现了一个简陋的固定大小块内存分配器,作为链表。
有个家伙搞砸了大小计算,导致复制数据超出最大块大小几个字节(当时指针只有2个字节长:))。然后它会用填充了零的垃圾覆盖下一个空闲块开头处的“下一个”链接。
这就导致断开了空闲块链。由于在那时刻其他软件部件维护了自己的指针指向它们正在使用的任何块,因此程序似乎运行得非常好。
但是当然,列表偶尔会短缺一些块,这个泄漏最终耗尽了自由块,导致应用程序挂起。
Get some memory, which will be used to remember the floor number
Put the floor number into the memory
Are we already on the target floor?
If so, we have nothing to do: finished
Otherwise:
Wait until the lift is idle
Go to the required floor
Release the memory we used to remember the floor number