0

我想使用 memcpy 将结构数组的元素复制到另一个。我相信这会导致我的程序由于某种原因而失败。另外我到底如何释放内存?

struct FaultCodes
{
  string troubleFound;
  string causeCode;
  string actionCode;
  string paymentCode;
  string suppCode;
  u_int16_t multiplier;
};

struct JobFaultInfo
{
  static const size_t NUM_CODES = 5;
  FaultCodes codes[NUM_CODES];
};

FaultCodes codes[JobFaultInfo::NUM_CODES];
// I have populated codes with the data.

JobFaultInfo info;
memcpy(info.codes, codes, sizeof(FaultCodes)*JobFaultInfo::NUM_CODES);
4

3 回答 3

6

仅当您复制的对象是所谓的 POD(普通旧数据结构)时,才允许使用 memcpy。但是您的结构包含不是 POD 的 std::string 对象。因此,您的整个结构不是 POD。

改用算法头中的 std::copy 。

于 2010-10-15T05:31:05.733 回答
6

Astd::string通常包含一个指向它存储字符的位置的指针。通过使用memcpy每个字符串,您会得到两个std::string实例,他们都认为他们必须释放该内存。砰。

您可以使用std::copyfrom<algorithm>代替。

但更好的是,使用 astd::vector而不是原始数组。

干杯&hth。

于 2010-10-15T05:33:28.117 回答
2

进入 std:: 域的那一刻,就不能使用 memcpy。这是因为包括字符串在内的所有 std 容器都将数据存储在其他位置,并且只保留该数据的指针。因此,如果您只是按位复制(如在 memcpy 中),您完全不知道您复制了什么。
正如建议的那样,分别使用向量和 std::copy 而不是使用普通数组和 memcpy。这些不会像 memcpy 那样具有快速复制的好处,但它比前一种方法更可靠。
如果您仍然想坚持使用 memcpy,那么正如我所解释的,您不能使用字符串。在您的结构中,您将拥有静态(堆栈)内存的二维字符数组。聊天 [5][MAX_STRING_LEN]。结构中的所有字符串都必须映射到该数组的每个元素中。现在您的结构将由纯数据和无指针组成,因此您可以使用 memcpy。
但请不要这样做,只需将向量与 std::copy 一起使用。

于 2010-10-15T05:55:16.037 回答