2010-10-15 203 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