从数组中删除单个指针

时间:2014-12-10 00:35:39

标签: c++ pointers

那么,如果有一个指针数组

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项目[任何位置]我会得到一个内存地址删除应该用来返回分配给东西的内存,但上面的代码似乎留下的东西,只删除指针数组。我错过了什么? 谢谢 //编辑以使问题更清晰

3 个答案:

答案 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个字节时,您可以获得更多的分配,因为动态分配是缓慢的操作。它实际上为效率分配了一个更大的块。

你可以在释放后使用一些地址,因为你没有释放整个块。