结构中的char *数据的C ++副本到另一个结构

时间:2014-04-26 11:10:47

标签: c++ string char copy segmentation-fault

当我尝试将char *数据从一个结构复制到另一个结构时,我遇到了问题。这是结构

struct connection_details
{
    char *server;
    char *user;
    char *password;
    char *database;
};

基本上我要做的是将数据从一个对象复制到另一个对象(connection_setup是一个私有的connection_details对象)这是来自另一个对象的构造函数的代码:

settings *tmp = new settings();
this->connection_setup.server = strdup(tmp->getSQLSettings().server);
delete tmp;

我不断得到分段错误,这是可以理解的,因为我可能触及了我不应该做的事情。

基本上,我所在的设置对象和对象都包含connection_details类型的私有成员变量。即

class settings {

public:
    settings();
    ~settings();
    connection_details getSQLSettings();
private:
    connection_details sqldetails;
};

感谢您的任何建议!

1 个答案:

答案 0 :(得分:2)

首先,您正在使用新的和免费的。这是一个非常糟糕的主意,因为一般情况下不会调用析构函数。你应该用删除替换free。

此外,你获得了strdup返回值的所有权,但是你没有把它释放到任何地方,但希望这是在未示出的代码中的某个地方完成的。

这里的问题似乎是为了返回get sql方法而复制了指针,所以现在你有两个指针指向同一个指针。

这是一个问题,因为当第一个被破坏时,它也会在你的析构函数中破坏指针,当第二个运行时,你将试图删除一个悬空指针...这可能是导致你的崩溃。

有几种方法可以解决这个问题:

  • 返回参考以避免复制。
  • 制作一个合适的复制构造函数来复制数据,而不是指针。
  • 使用更高级别的C ++元素,例如std :: string,或者至少使用智能指针等。