【问题标题】:What is the array form of 'delete'?“删除”的数组形式是什么?
【发布时间】:2010-10-26 00:24:48
【问题描述】:

当我使用数组名作为指针编译代码,并使用delete 删除数组名时,我收到一条警告,提示我在不使用数组形式的情况下删除数组(我不记得确切的措辞) .

基本代码是:

int data[5];
delete data;

那么,delete的数组形式是什么?

【问题讨论】:

  • 这会调用未定义的行为,因为该数组未使用 new[] 分配。

标签: c++ arrays memory-management


【解决方案1】:

delete的数组形式为:

delete [] data;

编辑:但正如其他人指出的那样,您不应该为这样定义的数据调用delete

int data[5];

您应该只在使用new 分配内存时调用它,如下所示:

int *data = new int[5];

【讨论】:

  • 但是他的int data[5]不是operator new()分配的,所以没有正确形式的operator delete()可以调用。
  • 有趣...答案是正确的,但是错了。他怎么已经拿到了 17 票?
  • 很容易回答实际提出的问题,而不是应该提出的问题。特别是当它在标题和最后一句话中重复时。
  • Jared - 仅限于您的问题,而不是这个答案是否值得的问题,也许标记为已接受答案的答案往往会吸引更多选票。看看 SO 人员是否对标记为接受之前和之后的所有答案的投票率进行任何统计分析会很有趣。
  • 那么在原问题中,如果用户不调用上面提到的delete形式,也不以替代形式创建数据,会不会造成内存泄漏?更新:不,不会。
【解决方案2】:

你要么想要:

int *data = new int[5];
... // time passes, stuff happens to data[]
delete[] data;

int data[5];
... // time passes, stuff happens to data[]
// note no delete of data

一般规则是:仅将delete 应用于来自new 的内存。如果使用了new 的数组形式,那么您必须使用delete 的数组形式来匹配。如果使用了展示位置new,那么您要么根本不调用delete,要么使用匹配的展示位置delete

由于变量int data[5] 是一个静态分配的数组,它不能传递给任何形式的delete 运算符。

【讨论】:

    【解决方案3】:

    正如其他人所说,你必须使用delete的向量形式:

    void some_func(size_t n)
    {
      int* data = new int[n];
    
      . . . // do stuff with the array
    
      delete [] data; // Explicitly free memory
    }
    

    对此要非常小心,因为有些编译器不会警告你。

    更好的是,很少需要使用向量 new/delete。考虑是否可以更改您的代码以使用 std::vector:

    void some_func(size_t n)
    {
      std::vector<int> data(n);
    
      . . . // do stuff with the array
    
    } // memory held by data will be freed here automatically
    

    如果您在本地范围内处理内存,请考虑使用STLSoftauto_buffer,如果可能,它将从内部缓冲区(作为实例的一部分保存在堆栈上)分配,仅如果不能,则进入堆:

    void some_func(size_t n)
    {
      stlsoft::auto_buffer<int, 10> data(n); // only allocates if n > 10
    
      . . . // do stuff with the array
    
    } // memory held by data will be freed here automatically, if any was allocated
    

    阅读more about auto_buffer

    【讨论】:

      【解决方案4】:

      所示代码在堆栈上或在数据段的初始化部分中具有数组,即您不释放它(正如其他人所提到的,这将是“未定义的行为”。) “免费商店”,您可以使用 delete [] data

      【讨论】:

        【解决方案5】:

        正如RichieHindle 上面所说,当您想要释放为data 指向的数组动态分配的空间时,您必须在保留字delete 和指向分配的开头的指针之间放置两个括号[]空间。由于data 可以指向内存中的单个int 以及数组中的第一个元素,这是让编译器知道您要删除整个内存块的唯一方法。如果您没有以正确的方式执行此操作,则行为是“未确定的”(Stroustrup,C++ 编程语言)。

        【讨论】:

          【解决方案6】:

          修复 C4154 和 C4156 警告

          float AR[5] = { 1.0f, 2.0f, ..., ..., ...};
          
          delete [] & AR;
          

          【讨论】:

          • 这是非常错误的。如果数组不是用new[] 创建的,那么尝试delete[] 是未定义的行为。如果幸运的话,它会崩溃,这样你就可以找到这个可怕的错误。
          猜你喜欢
          • 2015-02-10
          • 2011-04-11
          • 1970-01-01
          • 2017-10-05
          • 1970-01-01
          • 1970-01-01
          • 2011-03-12
          • 2021-01-30
          • 1970-01-01
          相关资源
          最近更新 更多