在下面的示例中我正在做深度复制,每一件事都运行正常但是当obj2超出范围时,析构函数正在调用并且它在析构函数中崩溃所以请帮助我的代码出错:
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
using namespace std;
class ClassA
{
private:
char *str;
int id;
public :
ClassA(int x, char *s)
{
int len = strlen(s)+1;
str = new char[len];
id = x;
strcpy(str, s);
}
~ClassA()
{
delete [] str;
}
ClassA(ClassA &obj)
{
id = obj.id;
int len = strlen(obj.str);
str = new char[len] + 1;
strcpy(str, obj.str + 1);
}
void disply()
{
cout << id << " " << str << endl;
}
};
int main()
{
ClassA Obj1(5, "hello");
{
ClassA Obj2 = Obj1;
Obj2.disply();
}
Obj1.disply();
return 0;
}
答案 0 :(得分:3)
您需要关注the rule of three并提供分配运算符。但这条线看起来很可疑:
str = new char[len] + 1;
strcpy(str, obj.str + 1);
你可能意味着
str = new char[len + 1];
strcpy(str, obj.str);
修完课程后,您可以使用std::string
代替char*
。
class ClassA
{
private:
std::string str;
int id;
public:
// no copy constructor or assignment operator or destructor required
};
答案 1 :(得分:0)
您需要一个赋值运算符。您需要像这样编写复制构造函数
ClassA(const ClassA &obj)
const非常重要。
另外,你有几个错误
int len = strlen(obj.str);
str = new char[len] + 1;
strcpy(str, obj.str + 1);
应该是
int len = strlen(obj.str);
str = new char[len + 1];
strcpy(str, obj.str);