c++ - 泄漏的内存是否会在 C/C++ 程序运行期间始终丢失?

标签 c++ c memory memory-management operating-system

以下代码有明显的内存泄漏:

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、维基百科、谷歌等网站上阅读更多关于智能指针的信息。

http://en.wikipedia.org/wiki/Smart_pointer

关于c++ - 泄漏的内存是否会在 C/C++ 程序运行期间始终丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13576969/

相关文章:

c++ - 如何理解频率图像中描述的平均像素数?

c++ - 那么 "this"的类型是什么?为什么 "this"不是左值?

c++ - 如何从 decltype 引用中获取值类型?

c - 静态数组在 while 循环中初始化。在这种情况下会发生堆栈溢出吗

c - C 中的点或 "reset"变量

memory - 内存中有多少个堆栈区域?

c# - C# 回调函数不是从 C++ 代码调用的

python - Python 如何处理来自 "elsewhere"的对象

c++ - 限制一个类的实例数

c - 如何在C代码中引用一个汉字