2011-04-10 162 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似乎是一个很好的方式在这里缓冲。它的构造函数接收元素号(不是字节),你不必记得删除内存。