2015-04-23 158 views
5

下面的代碼沒有做任何有趣的事情,但神祕的是爲什麼內存博士會認爲這是一個單元化讀取?有任何想法嗎?Dr內存和神祕的未初始化讀取

#include <memory> 

int main(int argc, const char* argv[]) 
{ 
    int aa[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

    std::unique_ptr<int[]> p {new int[10]}; 

    for (auto i = 0; i < 10; ++i) { 
     p[i] = aa[i]; 
    } 

    return 0; 
} // <-- Dr Memory says UNINITIALIZED READ here 

編輯:這裏是完整的錯誤細節。

Error #1: UNINITIALIZED READ: reading 0x0028ff20-0x0028ff24 4 byte(s) 
# 0 __mingw_glob        [src/main.cpp:14] 
# 1 _setargv         [src/main.cpp:14] 
# 2 __mingw_CRTStartup 
# 3 mainCRTStartup 
# 4 ntdll.dll!RtlInitializeExceptionChain +0x62  (0x772c8fe2 <ntdll.dll+0x38fe2>) 
# 5 ntdll.dll!RtlInitializeExceptionChain +0x35  (0x772c8fb5 <ntdll.dll+0x38fb5>) 
Note: @0:00:00.297 in thread 9780 
Note: instruction: cmp (%esi) $0x0040a11e 
+3

這個「醫生記憶」是否真的告訴你什麼,除了位置?沒有關於在讀取嘗試等時塊,偏移,堆棧或執行代碼行...?如果沒有,你可能想看看它的競爭...... –

+0

我編輯我的問題,添加它提供的細節。 –

+0

您需要提供正確的刪除程序。該代碼將嘗試「刪除」數據,但應該刪除[]它。 – stefan

回答

1

main功能指示的線路不發生錯誤的行。錯誤發生在堆棧跟蹤所示的__mingw_glob中,並且在之前出現,您的任何代碼都被調用。 (這是擴展在命令行上傳遞的文件名通配符的函數,在Linux上,這個工作由shell完成,但在Windows上它是C運行時的責任。)

換句話說,它發生在mingw庫。這可能是無害的誤報,你應該簡單地添加一個排除。

我建議可能Dr Memory已經錯誤地將它識別爲未初始化,因爲它是在任何代碼運行之前由操作系統初始化的,或者是在DrMemory被初始化之前運行的代碼,或者是因爲它被傳遞給系統調用它實際上並不讀取內存,而只是寫入內存。

爲什麼它在你的函數中顯示錯誤的行?

調試器默認嘗試向您顯示相關信息。由於您的代碼通常更容易出錯,而不是庫代碼,因此調試器將在調用堆棧中顯示代碼的最新實例。例如,如果在對free的調用的特定實現深度中發生錯誤,則不太可能是存在錯誤的庫堆代碼,因此代之以free的代碼將被識別爲可能的罪魁禍首。

在您的情況下,您的代碼在調用堆棧上沒有任何代碼,因此該算法無法找到任何代碼,並顯示錯誤的位置。