【问题标题】:Heap memory allocation crash with std::wstring堆内存分配崩溃与 std::wstring
【发布时间】:2011-08-02 11:51:44
【问题描述】:

我对 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");

错误是内存堆分配失败,结果是程序崩溃。为什么?怎么了?

【问题讨论】:

    标签: c++ unicode crash wstring


    【解决方案1】:

    std::vector 似乎是在这里制作缓冲区的好方法。它的构造函数接收元素编号(不是字节),您不必记住删除内存。

    【讨论】:

      【解决方案2】:
      wchar_t *buffer2 = (wchar_t*)malloc((size + 1) * sizeof(wchar_t));
                                                     ^^^^^^^^^^^^^^^^^
      

      malloc 分配多个字节 - 你不想要多个 wchar_t

      如果你用的是c++,正确的做法是:

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

      【讨论】:

      • @Stefano:没必要,_TRUNCATE 会帮你搞定的
      【解决方案3】:

      如果你使用 std::wstring 我假设你使用的是 C++,不要使用 malloc,使用 new & delete(只是一个旁注)

      【讨论】:

        猜你喜欢
        • 2010-11-14
        • 2016-10-09
        • 2011-05-28
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-17
        相关资源
        最近更新 更多