在C/C++程序运行期间,泄漏的内存会一直丢失吗
Will leaked memory always remain lost for the duration of C/C++ program?
以下代码存在明显的内存泄漏:
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
,否则它就不存在了。
程序现在是否可以写入该内存,并达到没有内存丢失的状态?
否-同样,一旦丢失了对已分配内存区域地址的引用,就无法恢复相应的内存块。
程序仍在运行时,操作系统能否恢复它?
否,在进程退出之前,操作系统不会恢复该内存。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在C/C++程序运行期间,泄漏的内存会一直丢失吗
- 为什么 q网页测试的内存一直在增加?
- QToolBar儿童名单一直在增长.Qt 内存泄漏
- 我试图打印强连接的组件,但我一直得到内存错误