复制构造函数中std :: string的赋值运算符不会执行深层复制。
我已经在不同的编译器中运行了代码,但是用处不大。
#include <iostream>
#include <cstring>
using namespace std;
class Geeks
{
public:
string geekname;
char* cs;
Geeks(string g)
{
geekname=g;
}
Geeks(const Geeks &obj)
{
this->geekname= (obj.geekname);
this->cs=new char(strlen(obj.cs));
strcpy(this->cs,obj.cs);
}
void printname()
{
cout << "Geekname is: \n" << geekname;
cout << "Geek informal name is: \n" << cs;
}
};
int main() {
Geeks *obj1=new Geeks("Abhi");
obj1->cs=new char(10);
strcpy(obj1->cs,"tejgadu");
obj1->printname();
Geeks *obj2=obj1;
delete obj1;
obj2->printname();
return 0;
}
程序在cout行崩溃<<“ Geekname是:\ n” << geekname;在obj2 printname调用中。 char *深度复制效果很好。
答案 0 :(得分:4)
问题是:
Geeks *obj2=obj1;
delete obj1;
这根本不会调用Geeks
复制构造函数。它只是将 pointer 复制到(一个)对象。然后,您删除该对象,并且(毫无疑问)无法对其进行任何操作。
指向对象的指针与对象不同。如果按值保存对象,则所有对象(例如Geeks obj1("Abhi");
)都会好起来,std::string
会进行适当的深层复制。
还请注意:
A)您的构造函数未初始化cs
。如果不手动设置,它将是一个随机值。初始化为nullptr
并进行测试要好得多。
B)您需要一个赋值运算符(或者您需要delete
)。
C)(如注释中所述),您需要new char[10]
创建一个数组。 new char(10)
将创建一个值为10的单个字符。
答案 1 :(得分:1)
您根本不会创建第二个对象,只需将指针复制到第一个对象即可!当您删除第一个对象并对其调用方法时,程序通常会崩溃或执行其他操作(未定义的行为)
您可以使用以下方法进行更改:
Geeks *obj2=new Geeks(*obj1);