以下代码有明显的内存泄漏:
void Memory_Leak(void);
void Lots_Of_Other_Stuff(void);
int main(){
Memory_Leak();
Lots_Of_Other_Stuff();
}
void Memory_Leak(void)
{
int *data = new int;
*data = 15;
return;
}
void Lots_Of_Other_Stuff(void){
//allocates/deletes more memory
//calls functions
//etc..
return;
}
在节目进行期间,内存还能恢复吗?
程序能否覆盖丢失的内存,达到没有内存丢失的状态?
操作系统能否在程序仍在运行时恢复它?
最佳答案
标准 C++ 无法知道您不再使用内存。
存在一些特定于平台的机制用于内省(introspection)内存堆,通常用于调试,例如
http://msdn.microsoft.com/en-us/library/974tc9t1(v=vs.80).aspx
理论上,您也许可以在运行Memory_Leak()
之前使用类似的东西来获取堆状态的“快照” >。然后在它完成后,你可以寻找任何你认为是泄漏的东西并释放它。 但不要这样做。只是为了彻底提及它。
避免泄漏的 C++ 方法是使用“智能”指针而不是“原始/裸/哑/C 风格”指针。例如:
void Memory_Leak(void) // actually, with this change it won't leak anymore...
{
shared_ptr<int> data (new int);
*data = 15;
return;
}
共享指针是一个带有析构函数的对象,因此它有机会在其生命周期结束时运行一些代码。该代码释放内存。在这种情况下,局部变量 data
在 return 语句处结束它的生命周期,如果 shared_ptr 没有被复制并存储在别处,那么在内存中保存的整数引用计数将为零。这样内存就会被释放。
您可以在 StackOverflow、维基百科、谷歌等网站上阅读更多关于智能指针的信息。
关于c++ - 泄漏的内存是否会在 C/C++ 程序运行期间始终丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13576969/