C ++ struct array copy

时间:2010-10-15 05:26:09

标签: c++ arrays gcc struct memcpy

我想使用memcpy将struct数组的元素复制到另一个。我相信这很可能导致我的程序由于某种原因而失败。另外我怎样才能释放内存?

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

3 个答案:

答案 0 :(得分:6)

如果您正在复制的对象是所谓的POD(普通旧数据结构),则仅允许使用memcpy。但是你的struct包含不是POD的std :: string对象。因此,您的整个结构不是POD。

改为使用算法标题中的std :: copy。

答案 1 :(得分:6)

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

您可以使用std::copy中的<algorithm>代替。

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

干杯&amp;第h

答案 2 :(得分:2)

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