- 默认拷贝构造
- 问题
- 解决方案
- 拷贝构造调用时机
C++编译器默认是逐字节拷贝(对非静态成员进行值拷贝)
问题当类的内部包含了指针,指针指向动态内存空间,逐字节拷贝就会出现两个对象指向同一块内存空间的情况,释放内存时,出现重复释放的问题,导致程序奔溃
示例:
class Person
{
public:
Person(char* name,int age)
{
mAge = age;
pName = new char[strlen(name)+1];
strcpy(pName,name);
}
~Person()
{
if(pName != nullptr)
{
delete[] pName;
pName = nullptr;
}
}
public:
int mAge;
char *pName;
}
void test()
{
Person p1("wuyou",18);
Person p2(p1);
}
解决方案
- 在类内部添加自己的拷贝构造
- 如果自定义了普通构造函数,编译器不在提供默认构造函数,但是会提供拷贝构造函数
- 类内添加了自定义拷贝后,将不再提供默认构造
Person(const Person &p)
{
mAge = p.mAge;
pName = new char[strlen(p.pName) + 1];
strcpy(pName,p.pName)
}
拷贝构造调用时机
- 对象以值传递的方式传给函数参数
- 对象以值传递的方式从函数返回
- 用一个对象初始化另一个对象
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)