那么,如果有一个指针数组
stuff **items;
stuff *testPTR;
items = new stuff[200];
其内容用于保存动态内存对象
items[0] = new stuff;
items[1] = new stuff;
etc.
testPTR = items[0];
我要删除这些项目,为什么这不起作用?
delete items[0];
delete items[1];
etc.
delete [] items;
我测试了这段代码,我仍然可以访问使用testPTR分配的内容(在删除语句运行之后),这是我之前设置的。
//stuff held in items[0] is still accessible with
*testPTR
我很困惑,因为如果我cout项目[任何位置]我会得到一个内存地址删除应该用来返回分配给东西的内存,但上面的代码似乎留下的东西,只删除指针数组。我错过了什么? 谢谢 //编辑以使问题更清晰
答案 0 :(得分:4)
delete items[0]
仅释放items[0]
指向的内存,它不会将项[0]设置为NULL。你必须自己做。
delete items[0];
items[0] = NULL;
etc
正如其他答案所指出的那样,内存的实际释放可能不会立即发生,但这是内存管理系统的一个实现细节,你不应该依赖它。
答案 1 :(得分:3)
除了pbkhrv所说的,delete
没有义务立即将内存释放回操作系统,因此无论您是否仍然可以访问返回的内存,它都是未定义的行为。如果您的程序不再拥有您尝试访问的内存空间,则只会出现分段错误,但如果delete
实际上没有将其返回给操作系统,则操作系统仍会将您的程序视为拥有记忆,并不介意你正在访问它。 delete
可能无法回馈内存的原因很简单,就是将内存分配给程序要快得多,如果再次调用new
,只需给出指向同一内存的指针即可自己的。
答案 2 :(得分:0)
除了其他答案,特别是Namfuak one。
看看下面的短节目:
#include <iostream>
using namespace std;
int main(void)
{
char *p = new char [1];
for (int i=0; 1;i++){
p[i]=0;
cout<<i<<endl;
}
return 0;
}
我猜你会期望当i = 1时它会崩溃。但对我来说,它实际上可以运行到32或64。
显然我没有分配我可以访问的所有内存。但我仍然可以访问它。
正如您所看到的,当您要求1个字节时,您可以获得更多的分配,因为动态分配是缓慢的操作。它实际上为效率分配了一个更大的块。
你可以在释放后使用一些地址,因为你没有释放整个块。