delete删除运算符
释放内存块。
语法
1
2
|
[::] delete cast-expression [::] delete [ ] cast-expression |
备注
cast-expression 参数必须是指向以前分配给使用 new 运算符创建的对象的内存块的指针。 delete 运算符的结果类型为 void,因此它不返回值。例如:
1
2
3
|
CDialog* MyDialog = new CDialog; // use MyDialog delete MyDialog; |
对指向不使用 new 分配的指针使用 delete 将产生不可预知的结果。但是,可以对值为 0 的指针使用 delete。此设置意味着,当 new 失败并返回 0 时,删除已失败 new 操作的结果不会造成损害。
new 和 delete 运算符还可用于内置类型(包括数组)。如果 pointer 指的是某一数组,请在 pointer 前放置空括号:
int* set = new int[100];
//use set[]
delete 运算符delete [] set;
对对象使用 delete 运算符将释放其内存。在删除对象后取消引用指针的程序可能会产生不可预知的结果或崩溃。
将 delete 用于释放 C++ 类对象的内存时,将在释放该对象的内存之前调用该对象的析构函数(如果该对象具有析构函数)。
如果 delete 运算符的操作数是可修改的左值,则在删除该对象后未定义其值。
使用 delete
有两个语法变体:一个针对单一对象,另一个针对对象数组。以下代码片段演示了它们之间的差异:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// expre_Using_delete.cpp struct UDType { }; int main() { // Allocate a user-defined object, UDObject, and an object // of type double on the free store using the // new operator. UDType *UDObject = new UDType; double *dObject = new double ; // Delete the two objects. delete UDObject; delete dObject; // Allocate an array of user-defined objects on the // free store using the new operator. UDType (*UDArr)[7] = new UDType[5][7]; // Use the array syntax to delete the array of objects. delete [] UDArr; } |
以下两种情况会生成未定义的结果:在对象中使用 delete 的数组形式 (delete [ ]),并在数组中使用 delete 的非数组形式。
delete 的工作方式
将调用函数运算符 delete。
对于不是类类型(class、struct 或 union)的对象,将调用全局 delete 运算符。对于类类型的对象,如果删除表达式以一元范围解析运算符 (::) 开始,则会在全局范围中解析释放函数的名称。否则,delete 运算符将在释放内存之前为对象调用析构函数(如果指针不为 null)。可为每个类定义 delete 运算符;如果给定类不存在这种定义,则会调用全局 delete 运算符。如果删除表达式用于释放其静态对象具有虚拟析构函数的类对象,则将通过对象的动态类型的虚拟析构函数解析释放函数。
相等运算符:== 和 !=
语法
1
2
|
expression == expression expression != expression |
备注
二元相等运算符将严格比较其操作数的相等性或不相等性。
相等运算符(等于 (==) 而不等于 (!=))的优先级低于关系运算符的优先级,但其行为类似。这些运算符的结果类型为 bool。
如果这两个操作数具有相同的值,则相等运算符 (==) 返回 true (1);否则返回 false (0)。如果操作数不具有相同的值,则不相等运算符 (!=) 返回 true;否则返回 false。
!= 的运算符关键字
not_eq 运算符是 != 的文本等效项。访问程序中的 not_eq 运算符的方式有两种:包括头文件 iso646.h,或使用 /Za(禁用语言扩展)编译器选项进行编译。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// expre_Equality_Operators.cpp // compile with: /EHsc #include <iostream> using namespace std; int main() { cout << boolalpha << "The true expression 3 != 2 yields: " << (3 != 2) << endl << "The false expression 20 == 10 yields: " << (20 == 10) << endl; } |
相等运算符可比较指向同一类型的成员的指针。