前言
本文主要介绍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.运行结果
成功解决指针悬挂
总结
在使用拷贝构造函数时,不要随便浅拷贝