void * intptr = new int;
delete (int *) intptr;
是否需要(int *)
类型广告?
答案 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)
。程序的行为将是不确定的。