变量被析构函数释放的时候的注意事项
作者:良知犹存
析构函数是C++类针对成员变量删除时候执行的函数,析构函数与构造函数作用刚好相反,一个在定义变量的时候执行,一直在释放的时候执行。在类里面析构函数是默认定义好的,函数内部没有任何执行的逻辑,它不会返回任何值,也不能带有任何参数,只进行变量的释放。如果你需要在析构函数里面打印一些数据,可以重新定义一次析构函数。析构函数的名称和类的名称是完全相同的,只是在前面加个波浪号(~)最为前缀,这时候我们自己定义好函数,在函数体内部就可以写一些打印信息的操作。
析构函数正常与构造函数一一对应的使用,但是有些时候因为程序赋值的问题,会导致变量多次释放,造成程序运行错误。
下面是一个简单的析构函数多次释放的示例
[*]
class Point{private: int x; int y; public: Point() { std::cout << "/* Point() */" << std::endl; } Point(int x,int y) : x(x),y(y) { std::cout << "/* Point(int x,int y) */" << std::endl; }};
int main(int argc,char** argv){ Point p1(2,3); Point p2 = p1;
return 0;} Point p1(2,3);
Point p2 = p1;
终端显示效果
注意串口打印数据的
/* Point(int x,int y) */
/* ~Point() */释放
/* ~Point() */再一次被释放
此时候发现一个变量被释放了两次。下面分析一下原因:
p1 与 p2都为Piont类型。
其中:p1:
.x = 2
.y =3
p2 = p1 属于值的拷贝,并没有进行地址切换
程序在执行完打印之后,分配的变量会自动用析构函数释放
p2 与 p1指向同一处地址,然后会被释放两次,所以需要注意。
"="赋值造成了混乱,此时候,引入了重载函数
此时运算符的重载中,我们可以使用“=”重载函数,可以在类中进行友员等重载,也可以在类之外进行重载,使其 = 赋值的时候形成新的变量,这样释放的时候就不会多次释放了。
本次实现在类里面实现
“=”重载函数考虑到返回值的效率小于返回引用,所以所以返回引用
[*]
Point& operator=(const Point& p) { cout << "operator=(const Point& p)" << endl; if(this == &p) return *this; this->x = p.x; this->y = p.y; return *this; } 在类里面添加此重载函数,进行利用重载函执行“=”的时候,将变量信息地址重新申请定义,这样变成两个不同变量,再释放就不会担心多此释放的问题了。
文档来源:51CTO技术博客https://blog.51cto.com/u_15294398/2987488
页:
[1]