我想知道 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/