我能否向delete[]提供参数,比如delete[3]?

7
我看到delete[]可以释放对象数组的内存。然而,我阅读的所有资料中都没有提到像delete[3]这样的参数是错误的还是未定义的。
我的问题如下:
  1. C++标准是否规定了我能否/不能使用delete[]的参数作为delete[3]
  2. 如果可以,那么会产生什么影响?
  3. 同样,C++是否规定了我能否/不能从new[]分配的数组使用delete

3
抱歉问这个问题,但是为什么你想要给一个删除操作传递参数呢? - John_Sharp1318
2
不要将其与 delete array[3] 混淆,后者会删除 array[3] 指向的任何内容(因此如果您有一个指针数组),而不是删除 array 或其中的某个部分。如果您想要这样做,删除子数组是不可能的。 - leemes
编写函数 'void move_from_array(int* target, int* source) { *target = source; delete[1] source++; / 或者直接使用 delete source++ */ target++; }' - pasha
@leemes...为了做到这一点,我首先必须单独分配数组的每个元素,对吧?这比使用new[]分配更困难。 - pasha
你在这里混淆了一些东西。你只能删除整个数组,而不能删除其中的一部分。因此,如果你想移动内容,首先要分配一个新的数组,然后移动内容,最后删除旧的数组。不是逐个元素地移动,那样行不通(如果可能的话,分配的项目会分散在内存中,而不像数组中那样连续)。 - leemes
把数组想象成一个大书架,里面有预定义数量的书槽。如果你要腾出一些空间,想把一些书拿走,你会希望书架能够缩小尺寸。假设你不擅长手工制作,无法自己把书架变小。你需要先买一个更小的书架,把书移过去,然后拆卸或出售不再需要的大书架。你不能只摧毁书架的一部分而不触及其他部分。删除一个元素是delete array[3],删除整个数组是delete[] array。希望这个比喻对您有所帮助。 - leemes
3个回答

11

(1) 是的,它指定了你不能这样做。

(3) 它指定了结果是未定义的,所以不要这样做。


4

delete[] 是一个运算符。

delete[x] 不是有效的C++语法,因此代码无法编译。


所以你的意思是 'delete[]' 就像一个函数名 'functionxyz',而我想做的是通过 'function123' 调用它? - pasha

0

是的,您可以使用delete [x]运算符传递任何参数,但这没有意义。 如果您在class中提到任何destructor,它将无限调用destructor。 请参见下面的示例

#include <iostream>
using namespace std;
class A
{
public: 
A() {
cout<<"\n Calling A constructor ";
}
/*~A(){
cout<<"\n Calling A Destructor ";
  }*/
};
int main()
{
A *a1= new A();

delete [3] a1;

return 0; 
}

上述程序(使用 VC++ 进行测试)可以成功编译和运行,如果将 destructor 部分取消注释,则可以成功编译,但是 destrutor 将被无限次调用,这是程序的未定义行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接