复制构造函数中的std :: string行为

时间:2019-06-13 14:36:08

标签: c++

复制构造函数中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 *深度复制效果很好。

2 个答案:

答案 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);