2010-01-18 98 views
2

我得到以下簡化的代碼存儲器分配錯誤(和隨後的崩潰):查找內存分配錯誤

std::wstring myKey = L"str_not_actually_constant"; 

MyType obj; 
Read(obj); 

std::map<std::wstring, MyType> myMap; 
myMap[myKey] = obj; // Sometimes allocation error (1) 
... 
Read(MyType& obj) 
{ 
    obj.member1 = ReadFromFuncThatMayBeProblem(); 
    obj.member2 = ReadFromFuncThatMayBeProblem(); // Sometimes allocation error (2) 
    /* more members */ 
} 
... 
void operator =(const MyType& source) 
{ 
    if(this != &source) 
    { 
    member1 = source.member1; // std::wstring 
    member2 = source.member2; // Usually (1) happen on the second member. // std::wstring 
    /* more members */ 
    } 
} 

或者(1)或(2)發生。

現在,如果我只是繼續無論錯誤(使用調試器),則該值確實是在地圖輸入。

我不知道,如果ReadFromFuncThatMayBeProblem()是罪魁禍首,但它是一個相當複雜的功能,我不能在這裏devulge。

而且,這是一個已經工作(或至少出現工作)之前,應用程序的其他部分被移植到使用OpenSSL代碼。不過,我不知道這可能是否有效。

所以,我能做些什麼來追查這個分配錯誤,因爲我假定上面的代碼其實也不是什麼問題?

編輯:更多信息: 沒有爲MyType的沒有析構函數。

但是,MyType有一個SecondType類型的成員,它具有一個void *成員。這是在該類型的析構函數中被刪除和空值的。構造函數使用m_pData = new std :: wstring(((std :: wstring)source.m_pData));爲字符串。 (和其他數據類型相似)。這可能是一個問題嗎? (刪除static_cast < std :: wstring *>(m_pData);)

MyType的其他成員類型是std :: wstring,unsigned long,bool,enum,structs(其中的timeb)和SecondType。

+0

您有完整的測試案例,我們可以嘗試一下嗎? – outis 2010-01-18 10:17:24

+0

MyType是否包含任何指針成員變量?在這種情況下,複製ctor和賦值運算符寫入正確嗎? – Naveen 2010-01-18 10:18:37

+0

outis:不,對不起。我無法提供。 Naveen:沒有指針成員變量。 – 2010-01-18 10:28:37

回答

2

終於找到了錯誤。

我們使用上述功能作爲使用OpenSSL的更大套接字通信的一部分(因此參考上文)。按照上述代碼簡化,套接字正在寫入數據並讀取數據。

插座被讀取的是,我們從一個緩衝區(動態改變大小)重新分配內存以另一種方式。在這樣做的時候,我們使用緩衝區的輸入和我們應該擴展的大小。大小計算使用模數來計算重新大小的因子。這導致緩衝區太大或太小,不適合以下操作。

兩天的調試將'%'更改爲'/'。

感謝您的支持,不過。

+0

我有一種感覺,你不使用斷言或大量的日誌記錄。你打算如何保持代碼獸在你的皮帶之下? – 2010-01-20 02:58:15

+1

我們正在使用斷言和日誌記錄。在這種情況下或者在這個特定的部分,我們根本沒有這樣的東西。感覺就像你試圖挑戰... – 2010-01-21 00:28:59

+0

+1對於簡單的錯誤,需要不成比例的努力來解決。很高興知道編程從不改變其核心。 – outis 2010-01-21 04:18:29

0

ReadFromFuncThatMayBeProblem()返回什麼類型?它是否返回一個(const)引用?如果是這樣,該對象在離開ReadFromFuncThatMayBeProblem()的範圍後仍然有效嗎?

+0

它返回成員的類型(std :: wstring,long等)。 (非常量) – 2010-01-19 09:10:21