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