2017-02-02 177 views
-4

我創建了一個堆棧,然後使用memcpy我將堆棧複製到緩衝區。後來我嘗試使用緩衝區創建堆棧對象。但我正在閱讀訪問衝突。STL堆棧:讀取訪問衝突

請參閱下面的代碼,可能會更好地解釋情況。

Byte *targetdata; 
class DATA 
{ 
    std::stack<int> scatter; 
}data; 
... 
... 
memcpy(targetdata, &data, sizeof(DATA)); 
... 
... 
{ 
    DATA data2; 
    memcpy(&data2, targetdata, sizeof(DATA)); 
}// Get a read access violation here. 
+0

'sizeof(DATA)'不會產生您的想法。 –

+1

C++有複製和移動語義,你不應該'memcopy'類。 –

回答

1

你不應該只是POD任何東西(「純老物件」,即結構可含有其它莢或普通類型,如僅int),因爲結構可能比只是一堆字節的更爲複雜的使用memcpy。詳情請看this question

在你的情況下,stack<>內部持有一個指向一段內存(或甚至幾塊)的指針,它們保存實際數據。當創建stack<>時,將分配該內存塊。當stack<>被銷燬(即變量不再可見,通常發生在})時,該部分內存被重新分配。如果您之後嘗試訪問它,則會出現未定義的行爲。如果您(或其他人)試圖在事後銷燬它,那麼也稱爲「雙免費」的未定義行爲。

所以,很可能你有雙免費或類似的未定義的行爲。請注意,細節嚴重取決於stack<>的確切實施。

在C++中,你應該使用=對於複雜結構的任務:

stack<int> a; 
// Fill up `a`. 
stack<int> b; 
b = a; 
// Now `a` and `b` are independent stacks with same content. 

這還應該與結構工作,無需額外的負擔。如果結構更復雜,則應用rule of three