【C++学习笔记之指针悬挂】


前言

本文主要介绍C++指针悬挂怎么产生的,以及代码实验


一、指针悬挂是什么?

我们知道指针可以指向一块内存空间。那么两个指针也可以指向一块内存空间。
在这里插入图片描述
如果从一个指针delete掉这块内存空间,就会变成这样
在这里插入图片描述
这个时候就形成指针悬挂啦

二、代码

1.构造一个Student类

class Student{
    string name;
    char *hobby;
public:
    Student(){
        hobby = new char[100];
        strcpy(hobby,"asd");
    }
    Student(Student& s){
        this->name=s.name;
        hobby=s.hobby;
    }
    ~Student(){
        delete hobby;
    }
    void print(){
        cout<<this->hobby<<endl;
    }
};

其中有一个指针,指向兴趣hobby。无参构造函数会new一块空间给hobby。拷贝构造函数,会传入一个Student的引用,直接把s的name,hobby的值赋值过去。 最后不能忘记在析构函数中delete掉hobby以免内存泄漏

2.进行使用Student类的使用

代码如下(示例):

void test2(){
    Student s;
    s.print();
    Student s1(s);
    s1.print();
}

在这里插入图片描述
可以看到main函数里面的cout语句因为test2()函数的崩溃而没有运行。


3.崩溃原因分析

是不能对同一内存空间delete两次的。s的hobby与s1的hobby执行同一块内存空间,在test2()函数结束时,s与s1的生命周期结束啦自动调用析构函数。所以才会崩溃。

4.构造一个Student2类

class Student2{
    string name;
    char *hobby;
public:
    Student2(){
        hobby = new char[100];
        strcpy(hobby,"asd");
    }
    Student2(Student2& s){
        this->name=s.name;
        hobby = new char[100];
        strcpy(hobby,s.hobby);
    }
    ~Student2(){
        delete hobby;
    }
    void print(){
        cout<<this->hobby<<endl;
    }
};

其中相对于Student类的的不同,拷贝函数是深拷贝,这样使用拷贝函数构造出来的对象的hobby指向的内存空间就不是同一块啦。这样在析构的时候,就不会发生delete同一块内存两次的情况

5.运行结果

在这里插入图片描述
成功解决指针悬挂

总结

在使用拷贝构造函数时,不要随便浅拷贝

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值