2013-02-17 33 views
-4

我有間歇長的一段時期運行時崩潰,並「訪問衝突」的程序。對它進行調試後,我發現了一個非常奇怪的現象。訪問衝突書面新分配的內存

上的代碼的程序崩潰指派(拷貝)一個std::vector到另一個,這樣的:

struct Data 
{ 
int int1; 
int int2; 
} 
//vec1 is empty 
//vec2 contains a couple of thousands Data structs 
std::vector<struct Data> vec1 = vec2;//**crash happens here** 

什麼情況是簡單 - STL分配存儲器塊vec1,和從vec2數據被複制那裏。分配情況良好。當STL試圖用vec2的數據填充新分配的內存vec1時,複製過程發生崩潰。 更奇怪的是,該複製過程的某些部分已正確執行,並且崩潰發生在該過程中的某個位置。

我的問題是 - 新分配的內存塊如何可以「部分」不可寫?謝謝。

編輯:傢伙,我不說這個代碼有問題 - 它當然不會。我在問爲什麼這種類型的代碼會崩潰?即我的程序的其他部分如何修改由STL新分配的內存塊?以及如何調試這種內存損壞?

是的,這纔是真正的代碼

加法:我已經啓用頁堆,以查看是否執行該代碼之前發生問題。它沒有抓到任何東西。

+0

這個問題是在別的地方......也許有一個懸掛指針或類似的地方。 – thang 2013-02-17 13:00:42

+0

這實際上是'Data'結構的外觀嗎?如果是這樣,那麼問題在別的地方。 – jalf 2013-02-17 13:01:14

+0

當免費商店遭到破壞時,幾乎可以發生任何事情。這種問題很難追查到,因爲腐敗發生在某個地方**之前,它顯示出症狀。 – 2013-02-17 13:01:35

回答

0

好的,我發現原因是不正確的同步,即vec2從輔助線程修改,而vec1處於初始化過程。對應於在原崗位的矢量分配STL代碼以下:

if (_Buy(_Right.size())) 
    _Mylast = _Ucopy(_Right._Myfirst, _Right._Mylast, _Myfirst); 

第一行對於新向量分配內存,和第二拷貝的內容。

發生了什麼事是第一行完成後(和內存分配),該向量是從外部線程修改,其大小增加。所以第二行試圖複製比分配內存大小更多的元素。這導致訪問衝突。