C++编程中删除运算符与相等运算符的使用解析

所属分类: 软件编程 / C 语言 阅读数: 39
收藏 0 赞 0 分享

delete删除运算符
释放内存块。
语法

[::] delete cast-expression
[::] delete [ ] cast-expression

备注
cast-expression 参数必须是指向以前分配给使用 new 运算符创建的对象的内存块的指针。 delete 运算符的结果类型为 void,因此它不返回值。例如:

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
有两个语法变体:一个针对单一对象,另一个针对对象数组。以下代码片段演示了它们之间的差异:

// 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 运算符。如果删除表达式用于释放其静态对象具有虚拟析构函数的类对象,则将通过对象的动态类型的虚拟析构函数解析释放函数。


相等运算符:== 和 !=

语法

   expression == expression
expression != expression

备注
二元相等运算符将严格比较其操作数的相等性或不相等性。
相等运算符(等于 (==) 而不等于 (!=))的优先级低于关系运算符的优先级,但其行为类似。这些运算符的结果类型为 bool。
如果这两个操作数具有相同的值,则相等运算符 (==) 返回 true (1);否则返回 false (0)。如果操作数不具有相同的值,则不相等运算符 (!=) 返回 true;否则返回 false。
!= 的运算符关键字
not_eq 运算符是 != 的文本等效项。访问程序中的 not_eq 运算符的方式有两种:包括头文件 iso646.h,或使用 /Za(禁用语言扩展)编译器选项进行编译。

// 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;
}

相等运算符可比较指向同一类型的成员的指针。

更多精彩内容其他人还在看

C++广播通信实例

这篇文章主要介绍了C++实现广播通信的方法,实例讲述了C++ socket广播通信的原理与实现方法,需要的朋友可以参考下
收藏 0 赞 0 分享

C++计算ICMP头的校验和实例

这篇文章主要介绍了C++计算ICMP头的校验和的方法,代码简单实用,对于校验ICMP报文来说有不错的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++设置超时时间的简单实现方法

这篇文章主要介绍了C++设置超时时间的简单实现方法,涉及系统函数setsockopt对套接口的操作,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++实现ping程序实例

这篇文章主要介绍了C++实现ping程序实例,涉及C++对于ICMP数据包的发送与回显处理,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之boost::array的用法

这篇文章主要介绍了C++之boost::array的用法,以实例的形式简单讲述了静态数组的容器boost::array的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之Boost::array用法简介

这篇文章主要介绍了C++之Boost::array用法简介,较为详细的分析了Boost::array中的常见用法,并用实例的形式予以总结归纳,需要的朋友可以参考下
收藏 0 赞 0 分享

VC文件目录常见操作实例汇总

这篇文章主要介绍了VC文件目录常见操作实例汇总,总结了VC针对文件目录的各种常用操作,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

VC打印word,excel文本文件的方法

这篇文章主要介绍了VC打印word,excel文本文件的方法,是VC操作文本文件中非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC++获得当前进程运行目录的方法

这篇文章主要介绍了VC++获得当前进程运行目录的方法,可通过系统函数实现该功能,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC中SendMessage和PostMessage的区别

这篇文章主要介绍了VC中SendMessage和PostMessage的区别,较为全面的分析了SendMessage和PostMessage运行原理及用法上的不同之处,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多