刘正的主页

帮趣游戏     进入个人中心
新浪微博

刘正

evan

fighting, 拼了!

http://bangqu.com/evan

职业: 软件开发

现居: 江苏省无锡市

  • 浏览 892次
  • 感谢 0人
  • 收益 ¥0.0元

C++中关于return的错误

  今天在项目中写了这么一个函数,用于处理将UNIT16 Byte格式转化为时间CString,函数代码如下所示:

CString FodOperation::FodByte_to_time(const unsigned char B[],int length)
{
      LOG(1)<<"Enter FodByte_to_time()"<<endl;
	time_t p = 1;
      time_t total_milliseconds=0;
	for (int i = length-1; i >= 0; i--)
	{
        total_milliseconds += B[i] *p;
		p *= 256;
	}
	time_t total_seconds = (total_milliseconds * 1.0) / 1000;

	struct tm *local;
	local=localtime(&total_seconds);

	char tmp_datetime[20];
	sprintf(tmp_datetime,"%d-%d-%d %d:%d:%d\n",local->tm_year+1900,local->tm_mon+1,local->tm_mday,local->tm_hour,local->tm_min,local->tm_sec);
	string datetime(tmp_datetime);
	LOG(1)<< datetime <<endl;
        return datetime;
}

  结果代码总是有问题,而且是很奇怪的在Windows 64bit下正常,但在Windows 32bit总是出现类似内存出错的问题。最终程序定位到“return datetime”这一句话出错。

  简直太奇怪了,程序里面return 都会有错误吗?太匪夷所思了!

  其实细心的读者已经发现:“char tmp_datetime[20]” 这一句code其实是有问题的,它里面的字符正好是20个,没有地方存放'\0'啦!

  但是为什么是"return"的时候才发生这个错误呢?!

  原因是:当函数退出的时候,C++会自动free一个函数中局部变量存储空间,而free一个char[ ]数组的时候,C++ Windows 32bit的库必须要找到'\0',不像C++ Windows 64bit的库那样做了容错处理,所以最终导致错误。

 总结的经验是:当我们遇到return的错误时,应该去查看函数中的局部变量被free是否正常。

分享时间: