C++ 是C+中delete运算符所需的正确类型+;?

C++ 是C+中delete运算符所需的正确类型+;?,c++,memory-management,casting,C++,Memory Management,Casting,是否需要(int*)类型转换?是 类型必须与新创建的类型匹配。唯一不必匹配的时间是通过基指针删除派生类型,其中基类型有一个虚拟析构函数。是。由于C++不是一个万能的对象语言,所以删除命令必须知道要删除的类型,以便知道如何删除它。 < P>是必需的,因为删除将为每个分配的元素调用析构函数,甚至对于int .p/p> 考虑这一点: void * intptr = new int; delete (int *) intptr; 会发生什么?将调用int的3个析构函数。第一个用于存储&字符[0],第二

是否需要
(int*)
类型转换?


类型必须与新创建的类型匹配。唯一不必匹配的时间是通过基指针删除派生类型,其中基类型有一个虚拟析构函数。

是。由于C++不是一个万能的对象语言,所以删除命令必须知道要删除的类型,以便知道如何删除它。

< P>是必需的,因为删除将为每个分配的元素调用析构函数,甚至对于int .p/p> 考虑这一点:

void * intptr = new int;
delete (int *) intptr;
会发生什么?将调用int的3个析构函数。第一个用于存储
&字符[0]
,第二个用于
&字符[4]
,第三个用于
&字符[8]
。考虑<代码>和字符(4)< /代码>和<代码>和字符(8)< /代码>超出分配内存的大小。即使大多数编译器中的析构函数都是伪的,但这是错误的行为。想象一下如果你写

char * chars = new char[3];

delete [] (int*)chars;
其中
Foo
具有析构函数和
sizeof(Foo)>sizeof(char)
。程序的行为将是未定义的

将调用int的3个析构函数


没有所谓的“int的析构函数”。delete/delete[]将只为非POD或POD类类型的对象调用析构函数。

可能的重复项不是重复项。这个问题是关于在通过
new[]
分配的内容上使用
delete
,并针对指向分配类型以外的类型的指针进行删除。在一条语句中两次调用未定义的行为。这里没有未定义的行为;
new
delete
匹配,类型也匹配。请注意,这是一个delete表达式,而不是运算符。因为实际上有一个delete操作符(
operator delete
/
operator delete[]
),所以区别很重要。虽然这是正确的,但注释没有任何意义。不管怎样,我看不到int和Obj> int **/COD>不是C++意义上的对象。在C#中,一切都是一个对象——所有数据类型都派生自System.object,因此可以共享公共方法。如果C#没有被垃圾收集,它可能在System.Object中有一个虚拟的d'tor,使它能够删除任何变量而不知道它的类型。在C++中,每个引用都可以是空的,但并不意味着空洞*可以包含方法。如果C++中的所有东西都是一个对象,那么Valuy是一个对象引用,并且可以在它上面使用删除(即使它没有虚拟Dor——它将编译和工作,它不会调用Dor Tor代码……):BooDy:虽然不是简单的未装箱类型:但是不是所有的。我怀疑,但在标准中发现了:[注意:这意味着delete表达式的语法必须与new分配的对象类型匹配,而不是与新表达式的语法匹配。-结束注意]只是为了澄清:它需要匹配的唯一原因不是为了删除它,而是为了调用正确的析构函数。
delete [] (Foo*)chars;