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

作者:良知犹存

转载请注明作者来源:https://mp.csdn.net/console/editor/html/10448795

围观欢迎添加wx:Allen-Iverson-me-LYN

 析构函数是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;
    }  

    在类里面添加此重载函数,进行利用重载函执行“=”的时候,将变量信息地址重新申请定义,这样变成两个不同变量,再释放就不会担心多此释放的问题了。

                                                 

 

                                                                                 ——END——

                                                   1582516653291945.png

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章