C ++中的delete运算符是否需要正确的类型?

时间:2011-09-29 00:52:14

标签: c++ memory-management casting

void * intptr = new int;
delete (int *) intptr;

是否需要(int *)类型广告?

4 个答案:

答案 0 :(得分:11)

该类型必须与new'd相匹配。它不必匹配的唯一时间是通过基指针删除派生类型,其中基类型具有虚拟析构函数。

答案 1 :(得分:4)

是。由于C ++不是所有对象语言,因此delete命令必须知道要删除的内容的类型,以便知道如何删除它。

答案 2 :(得分:1)

  

将调用3个用于int的析构函数。

没有“int的析构函数”这样的东西。 delete / delete []只会为非POD或POD类类型的东西调用析构函数。

答案 3 :(得分:0)

这是必需的,因为delete会为每个已分配的元素调用析构函数,即使对于int也是如此。

考虑一下:

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)。程序的行为将是不确定的。