由于对象复制过程中c++采用按位拷贝给另外一个对象时产生的野指针问题(两个对象公用同一块内存num指针指向了同一块内存)
#include<iostream>
#include"string"
using namespace std;
#include"string"
using namespace std;
class A
{
public:
int* num;
string str;
{
public:
int* num;
string str;
A(int* n,string s):num(n),str(s){}
~A()
{
delete num; //释放num所指向的内存空间
cout<<"delete me"<<endl;
}
};
~A()
{
delete num; //释放num所指向的内存空间
cout<<"delete me"<<endl;
}
};
int main()
{
int a = 3;
int* p = &a;
A c(p,"dffdfd");
A b = c;//复制对象
cout<<"c.num:"<<c.num<<endl;
cout<<"b.num:"<<b.num<<endl;//输出地址显示两者的成员num指向同一块内存
cout<<*(b.num)<<endl;
c.~A();//将对象c所占的内存释放,同时c中num指向的内存在析构函数中也被释放,此时b对象的成员变量num指向了无效内存,导致程序出错
// cout<<*(b.num)<<endl;
return 0;
}
{
int a = 3;
int* p = &a;
A c(p,"dffdfd");
A b = c;//复制对象
cout<<"c.num:"<<c.num<<endl;
cout<<"b.num:"<<b.num<<endl;//输出地址显示两者的成员num指向同一块内存
cout<<*(b.num)<<endl;
c.~A();//将对象c所占的内存释放,同时c中num指向的内存在析构函数中也被释放,此时b对象的成员变量num指向了无效内存,导致程序出错
// cout<<*(b.num)<<endl;
return 0;
}
当你把一个对象的值复制给另外一个对象时,如果你没有重载赋值运算符,那么将导致按位拷贝,最终产生野指针,或者释放同一块内存多次。
对于这种赋值的情况,我们可以通过重载赋值运算符来解决,也就可以避免按位拷贝了。
赋值情况主要有三种情况:
1.当一个对象初始化另外一个对象时,例如在声明中;
2.把所创建的对象拷贝(按位)传递给一个函数时;
3.生成临时对象时,最常见的就是函数返回值.
基本的拷贝构造函数的形式为:
class name (const classname &o)
{
}
c++中的拷贝构造函数就是针对这个问题而设计的。