【问题标题】:deleting indiviual pointers from an array从数组中删除单个指针
【发布时间】:2014-12-10 00:35:39
【问题描述】:

所以,如果 if 有一个指针数组

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

【问题讨论】:

  • 你为什么不用std::vector<std::unique_ptr<stuff>>然后你就不用再删除任何东西了。

标签: c++ pointers


【解决方案1】:

delete items[0] 仅释放 items[0] 指向的内存,它不会将 items[0] 设置为 NULL。你必须自己做。

delete items[0];
items[0] = NULL;
etc

正如其他答案所指出的,内存的实际释放可能不会立即发生,但这是内存管理系统的实现细节,您不应该依赖它。

【讨论】:

  • 谢谢,但我意识到这一点。我遇到的奇怪的事情是,即使应该通过运行 delete items[0] 将其删除,我仍然可以访问 testPTR 中保存的数据
  • Namfuak 说了什么 :-)
  • 答案之间的交叉递归?天哪,我们完蛋了
  • ...如果我们删除其中一个答案,那么我们将有一个悬空指针,从而演示当您 delete answers[0] 时会发生什么 :)
【解决方案2】:

除了pbkhrv所说的,delete没有义务立即将内存释放回操作系统,所以你是否仍然可以访问返回的内存是未定义的行为。如果您的程序不再拥有您尝试访问的内存空间,您只会遇到分段错误,但如果 delete 实际上没有将其归还给操作系统,则操作系统仍然认为您的程序拥有内存并且不介意您正在访问它。 delete 可能不归还内存的原因仅仅是保持分配给程序的内存要快得多,如果您再次调用 new,只需给您一个指向您已经拥有的相同内存的指针。

【讨论】:

    【解决方案3】:

    除了其他答案,尤其是 Namfuak 一个。

    看看下面的小程序:

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

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

    【讨论】:

    • Ideone 直到 12774 才会出现段错误,因为我们的 stdout 文件太长。我假设它的环境只是在程序执行之前在虚拟运行时分配了一堆内存。
    • 它依赖于操作系统和编译器,它只是简化了块中分配的想法以及当您从块中删除所有分配时整个块将释放的事实。
    猜你喜欢
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2023-03-21
    • 2014-01-16
    • 1970-01-01
    相关资源
    最近更新 更多