发布版本中的程序崩溃

时间:2011-04-27 15:43:24

标签: c++ serialization boost crash

在调试中工作正常但是当我在发布版本中运行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;
}

2 个答案:

答案 0 :(得分:4)

可能是因为未初始化的变量(在调试模式下,大多数变量初始化为零但在发布时未初始化)

这样的大多数错误都可以通过修复编译器生成的所有警告来修复(警告实际上是逻辑错误而不是语法错误)。所以设置你的警告级别更高的重新编译确保你得到零游戏。

在开发工作室中将警告级别设置为4,同时设置标志以将警告视为错误。

聚苯乙烯。而不是使用

动态分配缓冲区
wchar_t*  buffer = new char_t [<size>];

使用标准向量(它是异常安全的)

std::vector<wchar_t> buffer(<size>);

您可以使用以下命令获取指向缓​​冲区的指针:

&buffer[0]

另外:Jen(他删除了他的答案)有一个很好的观点)如果他不删除他的答案,我会删除这个并向上投票。

但是你可能想要检查字符串是否正确NULL终止L'\ 0'。

答案 1 :(得分:0)

有时编译器会尝试优化可能不允许在程序中间更改的值。

通知编译器避免优化特定变量声明为 volatile变量。