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

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

作者:良知犹存

转载请注明作者来源: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;

终端显示效果4edc953e2c684bbe819ffa954c899c08.png

注意串口打印数据的

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

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

4edc953e2c684bbe819ffa954c899c08.png

目录
相关文章
|
2月前
|
安全 Java 测试技术
如何避免静态变量初始化中的异常
在Java中,静态变量初始化时可能会遇到异常。为避免此类问题,可以采取以下措施:1. 使用静态代码块进行初始化;2. 确保初始化逻辑简单且安全;3. 捕获并处理可能的异常。这些方法能有效提高程序的健壯性和稳定性。
65 15
|
3月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
46 2
|
7月前
|
移动开发 程序员
程序员必知:【转】FMX动态创建及销毁(释放free)对象
程序员必知:【转】FMX动态创建及销毁(释放free)对象
40 0
|
8月前
|
存储 安全 Java
Python中的引用和赋值机制允许变量引用内存中的对象,并通过引用计数来管理对象的生命周期
【5月更文挑战第14天】Python中的变量是对象引用,不存储数据,而是在内存中创建对象。赋值操作创建新变量并使其指向已有对象。引用计数用于管理对象生命周期,引用数为0时对象被回收。理解这些机制对编写高效Python代码很重要。
70 6
|
8月前
|
编译器 C++ 容器
【C++11(一)】右值引用以及列表初始化
【C++11(一)】右值引用以及列表初始化
|
8月前
|
安全 编译器 C++
C++类与对象【对象的初始化和清理】
C++类与对象【对象的初始化和清理】
|
8月前
|
C++
C++多线程场景中的变量提前释放导致栈内存异常
C++多线程场景中的变量提前释放导致栈内存异常
91 0
|
安全 编译器 数据安全/隐私保护
对象的动态创建和销毁以及对象的复制,赋值
🐰对象的动态创建和销毁 🐰对象的复制 🐰对象的赋值
|
安全 编译器 C++
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(二)
朋友们好啊,今天终于更新了。我是柠檬叶子C,本章将继续讲解C++中的面向对象的知识点,本篇主要讲解默认成员函数中的构造函数、析构函数和拷贝构造函数。还是和以前一样,我们将由浅入深地去讲解,以 "初学者" 的角度去探索式地学习。会一步步地推进讲解,而不是直接把枯燥的知识点倒出来,应该会有不错的阅读体验。如果觉得不错,可以 "一键三连" 支持一下博主!你们的关注就是我更新的最大动力!Thanks ♪ (・ω・)ノ
107 0
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(二)
|
编译器 C++
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(一)
朋友们好啊,今天终于更新了。我是柠檬叶子C,本章将继续讲解C++中的面向对象的知识点,本篇主要讲解默认成员函数中的构造函数、析构函数和拷贝构造函数。还是和以前一样,我们将由浅入深地去讲解,以 "初学者" 的角度去探索式地学习。会一步步地推进讲解,而不是直接把枯燥的知识点倒出来,应该会有不错的阅读体验。如果觉得不错,可以 "一键三连" 支持一下博主!你们的关注就是我更新的最大动力!Thanks ♪ (・ω・)ノ
141 0
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(一)