c++ delete运算符的问题

发布网友 发布时间:2022-04-23 03:48

我来回答

4个回答

热心网友 时间:2023-10-13 19:41

Effective C++一书中如此描述:
1.当你使用new时,有两件事会发生。第一,内存被配置(透过函数operator new)。第二,会有一个(或以上)的constructors针对此内存被调用。当你使用delete时,也有两件事发生:一个(或以上)的destructors会针对此内存被调用,然后内存被释放(透过函数operator delete)。
2.如果你使用delete是未加括号,delete便假设删除对象是单一对象。否则便假设删除对象是个数组。
3.
string *stringPtr1 = new string;
string *stringPtr2 = new string[100];
……
delete stringPtr1;
delete [] stringPtr2;
如果你对着stringPtr1使用“[]”形式,其结果未定义。如果你对着stringPtr2没有使用“[]”形式,其结果亦未定义。犹有进者,这对内建型别如int者亦未定义,即使这类型别并没有destructors。
4.因此,规则很简单,如果你在调用new时使用了[],则你在调用delete时也使用[],如果你在调用new的时候没有[],那么你也不应该在调用时使用[]。

注:在vc中,delete[]可以取代delete.追问vs2008里面delete[]不能取代delete

热心网友 时间:2023-10-13 19:41

可能在一些编译环境下可以这样做,但准确的说,这样做是错误的。
delete [] 不能完全且不能取代 delete.
根据C++标准, delete []只能对new []的指针操作,否则结果是未定义的!结果是不可靠的,结果依赖于编译环境。

参考stackoverflow上的回答:
From the standard (5.3.5/2) :

In the first alternative (delete object), the value of the operand of delete shall be a pointer to a non-array object or a pointer to a sub-object (1.8) representing a base class of such an object (clause 10). If not, the behavior is undefined.

In the second alternative (delete array), the value of the operand of delete shall be the pointer value which resulted from a previous array new-expression. If not, the behavior is undefined.

热心网友 时间:2023-10-13 19:42

不会出错
不过最好是判断一下,a是不是为空,不为空时在删除

热心网友 时间:2023-10-13 19:42

在c++中,前面定义整型指针(int *a = new int;)后面应用运算符的形式为:delete a;delete [];应该是不正确的;

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com