【问题标题】:C++ copy of char* data in struct to another structC++ 将结构中的 char* 数据复制到另一个结构
【发布时间】:2014-04-26 11:10:47
【问题描述】:

我尝试将 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;
};

感谢您的建议!

【问题讨论】:

  • 你为什么不使用std::string?会使整个问题(以及更多问题)基本上消失。
  • 新的和免费的?!另外,你能分享一下sql设置的设置构造函数和getter吗?我的意思是实现。
  • 我敢打赌,如果您将connection_details getSQLSettings() 更改为connection_details& getSQLSettings(),那么它会正常工作。或者,您可以将 proper 复制构造函数添加到 struct connection_details.
  • 啊,对不起。我的意思是删除它。我看到了。
  • connection_details 的 4 个数据成员中的每一个使用 std::strings 会产生一些开销,因为有四倍分配和取消分配。如果这对性能至关重要,您应该只进行一次分配(因此不要使用std::string)。如果您不关心效率,std::string 很棒。

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


【解决方案1】:

首先,您是在使用 new 和 free 一起使用。这是一个非常糟糕的主意,因为通常不会调用析构函数。您应该将 free 替换为 delete。

此外,您获得了 strdup 的返回值的所有权,但您没有在任何地方释放它,但希望在未显示的代码中某处完成。

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

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

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

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

【讨论】:

  • 是的。我的意思是删除它。但是,我发现了这个问题。发生分段错误的原因是未在设置类上设置该值。所以我基本上什么都没做。
  • @user3575725:你是隐藏代码重要部分的好魔术师。 :)
  • 我想你已经说服我改用 std::string 了。我将更改实现。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
相关资源
最近更新 更多