在C/C++程序运行期间,泄漏的内存会一直丢失吗

Will leaked memory always remain lost for the duration of C/C++ program?

本文关键字:内存 一直 泄漏 C++ 程序 运行期      更新时间:2023-10-16

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

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++无法知道您不再使用内存。

存在一些特定于平台的机制来内省内存堆,通常用于调试,例如

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

否,在程序执行完毕之前,内存不会恢复。

没有。如果您能够重写该内存,那么从一开始就不会出现内存泄漏,因为您必须仍然有指向已分配内存的指针(用new或malloc分配新内存永远不会给您相同的已分配内存)。

没有。操作系统无法知道你的程序是否仍在使用内存,因此无法恢复。

是的,在程序运行期间内存会丢失。操作系统无法知道您已经丢失了对此内存位置的所有引用。

这是C/C++和Java/C#之间的一个基本区别。

垃圾回收是一种机制,用于确定内存位置是否不再有任何引用它的内容,也是允许操作系统回收未使用的内存的机制,在C/C++中不可用

在程序的持续时间内,每个内存都会被恢复吗?

否:除非您神奇地猜测丢失变量的地址并调用delete,否则它就不存在了。

程序现在是否可以写入该内存,并达到没有内存丢失的状态?

否-同样,一旦丢失了对已分配内存区域地址的引用,就无法恢复相应的内存块。

程序仍在运行时,操作系统能否恢复它?

否,在进程退出之前,操作系统不会恢复该内存。