在调试中,它工作正常,但是当我在发行版中运行C++ 2010程序(不是从Visual Studio的调试器启动)时,它崩溃了。如果我在第二次char * -wchar *转换后对行进行注释,则可以正常工作。为什么?

void myfunction(const char *dataBuffer)
{
    size_t buffer_size;

    mbstowcs_s(&buffer_size, NULL, 0, dataBuffer, _TRUNCATE);

    wchar_t *buffer = new wchar_t[buffer_size + 1];

    mbstowcs_s(&buffer_size, buffer, buffer_size, dataBuffer, _TRUNCATE);

    std::wstring archive_data(buffer);
    std::wstringstream archive_stream(archive_data);
    boost::archive::text_wiarchive archive(archive_stream);

    ...

    delete [] buffer;
    buffer = NULL;
}

最佳答案

可能由于未初始化的变量(在 Debug模式下,大多数变量已初始化为零,但在发行版中未初始化)

可以通过修复编译器生成的所有警告来修复大多数此类错误(警告实际上是逻辑错误,而不是语法错误)。因此,将警告级别设置为更高的重新编译,以确保获得零衰减。

在dev studio中,将警告级别设置为4,还将标志设置为将警告视为错误。

附言而不是动态分配缓冲区

wchar_t*  buffer = new char_t [<size>];

使用标准 vector (安全异常(exception))
std::vector<wchar_t> buffer(<size>);

您可以使用以下方法获得指向缓冲区的指针:
&buffer[0]

另外:Jen(删除了答案的人)说得很对),我将删除此内容,如果Jen取消删除答案,则对其进行投票。

但是您可能要检查字符串是否正确以NULL结尾的L'\ 0'。

08-16 10:41