2013-08-12 45 views
1

我寫的一個示例代碼,並在列表的push_back它總是導致信息轉儲 這是我的代碼:列表的push_back一個結構,它包括字符串類型核心

#include <iostream> 
#include <list> 
#include <string.h> 
using namespace std; 
struct FDTinstance 
{ 
    int type; 
    unsigned int expirestime; 
    unsigned int fileTOI; 
    string filename; 
    unsigned int contentlength; 
    unsigned long long T3; 
    unsigned long long T1; 
    unsigned long long T4; 
    unsigned long long sessionstarttime; 
}; 
struct PacketInfo 
{ 
    unsigned int port; 
    unsigned long long arrivetime; 
    unsigned int syncType; 
    unsigned short timeStamp; 
    unsigned short packNum; 
    unsigned int packCount; 
    unsigned int TSI; 
    unsigned int TOI; 
    FDTinstance fDTinstance; 
}; 
int main(int argc, char* argv[]) 
{ 
    struct PacketInfo packet; 
    packet.fDTinstance.filename = "http://123.com"; 
    packet.syncType=1; 
    packet.fDTinstance.expirestime = 100; 
    packet.fDTinstance.fileTOI = 0; 
    struct PacketInfo pack; 
    memcpy(&pack, &packet, sizeof(packet)); 
    mVodList.push_back(pack);//cause core 
    return 0; 
} 

如果我使用const char* filename,該程序就可以了。但是當我使用字符串類型時,程序將核心在push_back()。我不知道爲什麼。謝謝

+3

問題不在於'push_back',它是'memcpy'。你真的不想使用它。 – juanchopanza

+2

push_back實際上推送了你傳遞的對象的一個​​副本,所以跳過使用'pack',而只是'mVodList.push_back(packet);'並且完成它。 –

回答

3

只需卸下memcpy和做到這一點:

PacketInfo pack = packet; 

,甚至更好,完全忘了中間副本,這樣做:

mVodList.push_back(packet); // stores a copy of packet 

的原因是,memcpy僅適用於POD類型,並且std::string不是其中之一。無論如何,即使對於POD,使用複製構造函數或賦值運算符也是將一個對象複製到另一個對象的習慣方式。

另請注意,在C++中,您無需在全地方編寫struct。那麼爲什麼說這個

struct PacketInfo packet; 

當你可以這樣說?

PacketInfo packet; 
+0

謝謝我知道根本原因。但我需要將數據包複製到包中。但我認爲「PacketInfo pack = packet」無法複製該對象。 – Ericzhang88120

+1

@ Ericzhang88120是的。 – Hulk

+0

@ Ericzhang88120這就是你如何在C++中複製事物。 – juanchopanza

2
memcpy(&pack,&packet,sizeof(packet)); 

這不是複製非POD對象的有效方法,也沒有理由將它用於POD對象。只需使用賦值運算符(operator=)。或者複製構造函數。

相關問題