2013-07-23 157 views
0

這是我的示例代碼:刪除[]觸發斷點

int main() 
{ 
    const wchar_t *envpath = L"hello\\"; 
    const wchar_t *dir = L"hello2\\"; 
    const wchar_t *core = L"hello3"; 

    wchar_t *corepath = new wchar_t[ 
     wcslen(envpath) + 
     wcslen(dir) + 
     wcslen(core) 
    ]; 

    wcscpy_s(corepath, wcslen(corepath) + wcslen(envpath) + 1, envpath); 
    wcscat_s(corepath, wcslen(corepath) + wcslen(dir) + 1, dir); 
    wcscat_s(corepath, wcslen(corepath) + wcslen(core) + 1, core); 

    delete []corepath; 
    return 0; 
} 

delete []corepath命令,斷點被觸發。
可能是什麼原因?

另外,如果我重寫代碼是這樣的:刪除指針,當檢測

wcscpy_s(corepath, wcslen(envpath) + 1, envpath); 
    wcscat_s(corepath, wcslen(corepath) + wcslen(dir) + 1, dir); 
    wcscat_s(corepath, wcslen(corepath) + wcslen(core) + 1, core); 

堆損壞。

編輯:

我想我也應該分配corepath與+1儲存結束\ 0,對不對?

+1

「我想我也應該分配corepath與+1存儲結局\ 0,對嗎?「是。更好的是,使用'std :: wstring'來正確處理所有的內存分配。 –

+1

wcslen返回字符串的長度,沒有NULL終止字符,所以當你分配corepath時,你應該考慮NULL終止字符。 – TheDarkKnight

回答

5

您沒有分配足夠的空間來包含終止零。 wcscat_s的最後一次調用將在corepath指向的緩衝區末尾寫入。

你也在說謊緩衝區的容量wcscat_s。容量爲wcslen(envpath) + wcslen(dir) + wcslen(core),但您改爲通過wcslen(corepath) + wcslen(core) + 1

corepath被初始化之前,您還打電話給wcslen(corepath)

固定的代碼應該是這樣的:

int main() 
{ 
    const wchar_t *envpath = L"hello\\"; 
    const wchar_t *dir = L"hello2\\"; 
    const wchar_t *core = L"hello3"; 

    size_t cap = wcslen(envpath) + 
     wcslen(dir) + 
     wcslen(core) + 1; 

    wchar_t *corepath = new wchar_t[cap]; 

    wcscpy_s(corepath, cap, envpath); 
    wcscat_s(corepath, cap, dir); 
    wcscat_s(corepath, cap, core); 

    delete[] corepath; 
    return 0; 
} 

事實上,固定的代碼應該是這樣的:

#include <string> 
int main() 
{ 
    const wchar_t *envpath = L"hello\\"; 
    const wchar_t *dir = L"hello2\\"; 
    const wchar_t *core = L"hello3"; 

    std::wstring corepath = envpath; 
    corepath.append(dir); 
    corepath.append(core); 
} 
+0

+1爲最終版本。 –