栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ ofstream崩溃记录

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ ofstream崩溃记录

ue4环境下,项目需要下载热更文件到本地,但是怪事出现了,编辑器PIE中运行良好的代码,打包后稳定崩溃。
经检查dmp文件,崩溃发生在输出流ofstream的close函数中。

	TArray saveData = 服务器http响应的body;
	std::ofstream* file = new std::ofstream("文件名");
	file << (const char*)saveData.getData();
	file.close();//崩溃

提前说下,ue4的TArray类似于std::vector,uint8 即 unsigned char

观察写入的文件发现,文件末尾会意外的出现随机字符。
VS的调试器无法解析saveData信息,显示为无效的字符串
在同事的不懈努力(各种写入方法穷举尝试)
发现将<<运算符替换为file.write() 方法后即可修复崩溃问题。
通过打印日志后发现

Log(saveData.Num(),strlen((const char*)saveData.getData()));// Log:37650,37686

确认异常为strlen()引发,观察对内存数据发现,
saveData[saveData.Num() - 1] == ‘m’
众所周知,strlen的经典实现方式(未进行任何优化)

size_t strlen(const char* str)
{
	size_t size = 0;
	while(*(str + size) != '')
	{
		++size;
	}
	return size;
}

默认是以’’为字符串的结束标志,若该字符串中不包含这个结束符,则返回的值可能会远大于实际字符串长度,当流写入时,导致数组访问越界,最终导致崩溃。

解决方案很简单

	file.write((const char*)saveData.getData(),saveData.Num());
	file.close();
	//或
	saveData.Add('');
	file << (const char*)saveData.getData();
	file.close();

显然第一种方案更好,避免了动态数据的空间增长的可能。
至于PIE模式下为什么不会崩溃,这就可能要问msvc的Debug模式了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/998044.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号