评论

收藏

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

编程语言 编程语言 发布于:2021-07-06 11:25 | 阅读数:443 | 评论:0

DSC0000.jpeg

  作者:良知犹存
  析构函数是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;
  终端显示效果
DSC0001.jpeg

  注意串口打印数据的
  /* 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;  }
    在类里面添加此重载函数,进行利用重载函执行“=”的时候,将变量信息地址重新申请定义,这样变成两个不同变量,再释放就不会担心多此释放的问题了。
DSC0002.png

DSC0003.png


  
关注下面的标签,发现更多相似文章