江南才子 发表于 2021-7-6 11:25:53

变量被析构函数释放的时候的注意事项


  作者:良知犹存
  析构函数是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]
查看完整版本: 变量被析构函数释放的时候的注意事项