C++编程中删除运算符与相等运算符的使用解析
delete删除运算符
释放内存块。
语法
[::]deletecast-expression [::]delete[]cast-expression
备注
cast-expression参数必须是指向以前分配给使用new运算符创建的对象的内存块的指针。delete运算符的结果类型为void,因此它不返回值。例如:
CDialog*MyDialog=newCDialog; //useMyDialog deleteMyDialog;
对指向不使用new分配的指针使用delete将产生不可预知的结果。但是,可以对值为0的指针使用delete。此设置意味着,当new失败并返回0时,删除已失败new操作的结果不会造成损害。
new和delete运算符还可用于内置类型(包括数组)。如果pointer指的是某一数组,请在pointer前放置空括号:
int*set=newint[100];
//useset[]
delete运算符delete[]set;
对对象使用delete运算符将释放其内存。在删除对象后取消引用指针的程序可能会产生不可预知的结果或崩溃。
将delete用于释放C++类对象的内存时,将在释放该对象的内存之前调用该对象的析构函数(如果该对象具有析构函数)。
如果delete运算符的操作数是可修改的左值,则在删除该对象后未定义其值。
使用delete
有两个语法变体:一个针对单一对象,另一个针对对象数组。以下代码片段演示了它们之间的差异:
//expre_Using_delete.cpp structUDType { }; intmain() { //Allocateauser-definedobject,UDObject,andanobject //oftypedoubleonthefreestoreusingthe //newoperator. UDType*UDObject=newUDType; double*dObject=newdouble; //Deletethetwoobjects. deleteUDObject; deletedObject; //Allocateanarrayofuser-definedobjectsonthe //freestoreusingthenewoperator. UDType(*UDArr)[7]=newUDType[5][7]; //Usethearraysyntaxtodeletethearrayofobjects. delete[]UDArr; }
以下两种情况会生成未定义的结果:在对象中使用delete的数组形式(delete[]),并在数组中使用delete的非数组形式。
delete的工作方式
将调用函数运算符delete。
对于不是类类型(class、struct或union)的对象,将调用全局delete运算符。对于类类型的对象,如果删除表达式以一元范围解析运算符(::)开始,则会在全局范围中解析释放函数的名称。否则,delete运算符将在释放内存之前为对象调用析构函数(如果指针不为null)。可为每个类定义delete运算符;如果给定类不存在这种定义,则会调用全局delete运算符。如果删除表达式用于释放其静态对象具有虚拟析构函数的类对象,则将通过对象的动态类型的虚拟析构函数解析释放函数。
相等运算符:==和!=
语法
expression==expression expression!=expression
备注
二元相等运算符将严格比较其操作数的相等性或不相等性。
相等运算符(等于(==)而不等于(!=))的优先级低于关系运算符的优先级,但其行为类似。这些运算符的结果类型为bool。
如果这两个操作数具有相同的值,则相等运算符(==)返回true(1);否则返回false(0)。如果操作数不具有相同的值,则不相等运算符(!=)返回true;否则返回false。
!=的运算符关键字
not_eq运算符是!=的文本等效项。访问程序中的not_eq运算符的方式有两种:包括头文件iso646.h,或使用/Za(禁用语言扩展)编译器选项进行编译。
//expre_Equality_Operators.cpp //compilewith:/EHsc #include<iostream> usingnamespacestd; intmain(){ cout<<boolalpha <<"Thetrueexpression3!=2yields:" <<(3!=2)<<endl <<"Thefalseexpression20==10yields:" <<(20==10)<<endl; }
相等运算符可比较指向同一类型的成员的指针。