void * intptr = new int;
delete (int *) intptr;
需要进行 (int*)
类型转换吗?
void * intptr = new int;
delete (int *) intptr;
需要进行 (int*)
类型转换吗?
是的。
类型必须与new时的类型匹配。唯一不需要匹配的情况是通过基指针删除派生类型的情况,其中基类型具有虚析构函数。
是的。由于C ++不是一种完全面向对象的语言,因此删除命令必须知道您要删除的内容的类型,以便知道如何删除它。
int
或者int*
在C++中不是一个对象。 - pmr将调用3个int的析构函数。
并不存在“int的析构函数”这种东西。delete/delete[]只会为非POD或POD类类型调用析构函数。
这是必需的,因为即使是 int 类型,delete 操作也会为每个已分配元素调用析构函数。
考虑以下示例:
char * chars = new char[3];
delete [] (int*)chars;
会发生什么?3个int的析构函数将被调用。第一个是&chars[0]
的内存地址,第二个是&chars[4]
,第三个是&chars[8]
。请注意,&chars[4]
和&chars[8]
超出了分配内存的大小。即使在大多数编译器中,int
的析构函数是虚函数,但这是错误的行为。想象一下如果你写了这样的代码。
delete [] (Foo*)chars;
如果 Foo
有析构函数且 sizeof(Foo) > sizeof(char)
,那么你的程序行为将是未定义的。
new[]
分配的东西上使用delete
和针对分配类型之外的指针进行删除的。一条语句中有两次未定义行为。这里没有未定义的行为;new
与delete
匹配,并且类型也匹配。 - David Hammenoperator delete
/operator delete[]
),所以这个区别很重要。 - GManNickG