我想知道 delete[] 运算符如何处理函数返回的指针,而不是在与 delete 语句相同的范围内进行动态分配。假设我有一个像这样的微不足道的功能:

int *getArray()
{
    int *returnVal = new int[3];
    returnVal[0] = returnVal[1] = returnVal[2] = 0;
    return returnVal;
}

现在,当我需要在代码中使用该数组时,我会执行以下操作:
int *vals = getArray();
// use values...
delete[] vals;

但是,我想知道,C++ 编译器如何知道分配的内存块有多大(以及要从 vals 中删除多少个内存元素)?这是一种有效的技术,还是我必须单独删除每个数组值(如下面的代码所示)?
int *vals = getArray();
// use values...
delete vals + 2;
delete vals + 1;
delete vals;

最佳答案

你应该只 delete[] 通过 new[] 获得的东西。在您的代码中,这是 getArray() 返回的值。删除其他任何内容都是非法的。



每个实现都以某种方式存储分配的大小(以及我认为的类型)。

  • 一个常见的想法是存储簿记信息(或索引
    某种形式)就在实际分配的内存之前。
  • 另一个想法是使用实​​际指针作为保存所需信息的数据结构的键

  • 当然,这解释的过于简单了(更像是对 C 的解释)。在 C++ 中有析构函数和诸如此类的附加细节。

    关于c++ - delete[] 运算符是否使用通过指针返回的动态分配内存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7514365/

    10-14 09:50
    查看更多