簡體   English   中英

為什么不正確的 memory 分配給緩沖區只會在發布模式而不是調試模式下編譯時導致崩潰?

[英]Why would an incorrect memory allocation to a buffer only cause crashes when compiled in Release mode and not in Debug mode?

這是我設法完成的第一個項目,所以我有點不確定如何引用可執行文件與正在“調試模式”下工作和調試的項目,或者是否有多種方法可以這樣做等等,等等.

然而,更具體地說,我遇到了一個堆損壞問題,該問題僅在 Visual Studio 2019 設置為發布模式時出現,吐出我的程序的“exe”版本,然后以該形式進行第一次調試 session。 事實證明(我可能錯了,但這是我在問題完全消失之前更改的最后一件事)以下代碼:

std::unique_ptr<std::vector<Stat>> getSelStudStats(HWND listboxcharnames) {
    std::unique_ptr<std::vector<Stat>> selStats = std::make_unique<std::vector<Stat>>();
    int pos = ListBox_GetCurSel(listboxcharnames);
    int len = ListBox_GetTextLen(listboxcharnames, pos);
    const wchar_t* buffer = new const wchar_t[++len];
    ListBox_GetText(listboxcharnames, pos, buffer);

    for (int i = 0; i < getSize(); i++) {
        Character character = getCharacterPtr(i);

        std::wstring name = character.getName();
        if (name.compare(buffer) == 0) {
            *selStats = character.getAllStats();
            return selStats;
        }
    }
    return selStats;
    delete[] buffer;
}

沒有通過lenbuffer變量分配正確的大小。 通過將前綴增量運算符添加到len ,現在可以考慮與列表框文本一起出現的 null 終止符; 因此,堆損壞錯誤停止發生。

雖然我很高興解決了這個問題,但我不知道為什么 VS2019 沒有在調試模式下提出這個問題。 在嘗試調試問題時,我了解到發布模式下的優化可以改變代碼執行的結構和順序。

在這段代碼中是否有一些東西會產生我遇到的錯誤,但僅限於發布模式/可執行形式?

已編輯:我刪除了最初圍繞++len的星號,以突出我引用的更改。 對它造成的混亂表示歉意,這是可以理解的。

文檔解釋了這種行為:

當您請求 memory 塊時,調試堆管理器會從基本堆中分配比請求稍大的 memory 塊,並返回指向該塊的您的部分的指針。 例如,假設您的應用程序包含調用:malloc(10)。 在 Release 版本中,malloc 將調用基本堆分配例程,請求分配 10 個字節。 然而,在 Debug 版本中,malloc 將調用 _malloc_dbg,然后它將調用基本堆分配例程,請求分配 10 字節加上大約 36 字節的額外 memory。

所以在調試中你不會溢出你的緩沖區。 但是,它可能會在以后導致其他錯誤(但不太可能導致一個字節溢出。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM