2011-04-10 108 views
0

我有一個很大的問題與std :: wstring內存分配。程序崩潰時,我嘗試使用此代碼:堆內存分配崩潰與std :: wstring

size_t size; 
mbstowcs_s(&size, NULL, 0, buffer, _TRUNCATE); 
wchar_t *buffer2 = (wchar_t*)malloc(size + 1); 
mbstowcs_s(&size, buffer, buffer_size, buffer, _TRUNCATE); 
buffer2[size] = '\0'; 

std::wstring data(buffer); 

崩潰是最後一行,如果我使用下面的行不會發生:

std::wstring data(L"hello"); 

錯誤是內存堆分配失敗,結果是程序崩潰。爲什麼?怎麼了?

回答

7
wchar_t *buffer2 = (wchar_t*)malloc((size + 1) * sizeof(wchar_t)); 
               ^^^^^^^^^^^^^^^^^ 

malloc分配的字節數 - 你wan't一些wchar_t

的。如果你使用C++,正確的方法是:

wchar_t *buffer2 = new wchar_t[size+1]; 
+0

它的工作原理,但我應該添加\ 0字符緩衝區2 [大小]? – Stefano 2011-04-10 13:47:21

+0

@Stefano:不需要,_TRUNCATE爲您做到這一點 – Erik 2011-04-10 14:39:36

5

如果使用std :: wstring我假設你使用C++,不使用malloc,使用新的&刪除(只是一個旁註)

0

std :: vector似乎是一個很好的方式在這裏緩衝。它的構造函數接收元素號(不是字節),你不必記得刪除內存。