2010-10-15 82 views
0

我想通过使用memcpy将结构数组的元素复制到另一个结构数组的元素。我相信这会导致我的程序由于某种原因失败。另外我怎样才能最终释放内存?C++ struct array copy

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

回答

6

只允许的情况下使用memcpy你复制的对象是所谓的POD(普通旧数据结构)。但是你的结构体包含不是POD的std :: string对象。因此,你的整个结构不是POD。

改为从算法头中使用std :: copy。

6

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

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

但更好的是,使用std::vector来代替原始的数组。

干杯&心连心。

+0

非常感谢..哎呀我怎么会不知道:P ... – nixgadgets 2010-10-15 05:43:01

2

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

+0

感谢了一堆。确实是一个非常好的解释。我已经开始使用矢量。甚至不知道为什么我走下使用数组的路径:S ... – nixgadgets 2010-10-15 06:00:20