VC debug与Release 的变量初始化问题

xzjxylophone 2010-12-09 10:29:42
VC 中 debug和Release模式是有区别的:
其中一条关于 变量初始化 有如下的说法(摘自网络):
1. 变量。
大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过)。这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug方式下可能会忽略而不被察觉到,如debug方式下数组越界也大多不会出错,在 release中就暴露出来了,这个找起来就比较难了
注1:
debug版初始化成0xcc是因为0xcc在x86下是一条int 3单步中断指令,这样程序如果跑飞了遇到0xcc就会停下来,这和单片机编程时一般将没用的代码空间填入jmp 0000语句是一样地

我 在编程过程中 用到如下的一段代码:

CString efsrResult;
efsrResult.Empty();
//GetFileContentByExtensiveInformation 原型为
//bool GetFileContentByExtensiveInformation(CString &result)
//在这里可以得到正确的结果假设为“AAAA”
if(GetFileContentByExtensiveInformation(efsrResult))
{
/////m_AB 的声明是: list<CString> m_AB;
m_AB.push_back("A");
///输出efsrResult
m_AB.push_back("B");
///输出efsrResult
m_AB.push_back("C");
///输出efsrResult
m_AB.push_back("D");
///输出efsrResult
m_AB.push_back("E");
///输出efsrResult
m_AB.push_back("F");
///输出efsrResult
}


在debug 模式下, 这段程序无论运行几次都没有问题

而在 Release模式下,有时这段程序中efsrResult是正确的

而有时efsrResult 又分别变成了 A,B,C,D,E,F了。。。。

因此我想就是应该跟帖子最开始所说的一样



因此我们在编程的时候, 应该初始化 自己的变量

以下是我 认为应该这样初始化的:

int a = 0;
double b = 0;
bool a = false;
BOOL a = FALSE;


CString a = _T("");


char a = 'A'

所有的指针:
xxxx* a = NULL;(如果有就直接复制,或者从new一个出来)

对于一个类:或者结构体 直接用
A a; 应该就可以了吧


不知道 这里 我总结的有没有错误
或者什么遗漏的,
希望广大 大虾 说说你们的看法
谢谢了




...全文
924 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fc_cpp 2010-12-09
  • 打赏
  • 举报
回复
类类型的变量不显示初始化,那么会用类默认的构造函数去初始化,但是对于内置类型的变量,不初始化,在debug模式下将填充0xcc..
luciferisnotsatan 2010-12-09
  • 打赏
  • 举报
回复
debug版本下,对于未初始化的值,都会填0xcc。而且栈上的变量之间,函数调用,也会填充额外空间。
bluewanderer 2010-12-09
  • 打赏
  • 举报
回复
无意义的初始化会隐藏逻辑上的错误。

比如原本

int a;

....

foo(a); // 出于逻辑上的错误,导致a没有正常赋值,这里是会被提示的

如果你
int a = 0;

....

foo(a); // 不会被提示

----

总之,尽量不要做多余的事

特别是字符串,乱初始化还是有不少运行时代价的


----

然后只有栈变量是那样,全局变量都会初始化为0。

A a; <- 类的话是因为有构造函数,POD和数组没区别。

----

另外Debug模式变量之间有fence,Release模式没有
libinfei8848 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xzjxylophone 的回复:]

对于一个 对象:

A a;
就应该已经初始化了
不需要在做其他的初始化工作了
[/Quote]
那也要看A的构造函数有没有做好所有的初始化工作
xzjxylophone 2010-12-09
  • 打赏
  • 举报
回复
对于一个 对象:

A a;
就应该已经初始化了
不需要在做其他的初始化工作了
mujiok2003 2010-12-09
  • 打赏
  • 举报
回复
1. 对象应该在初始化后使用
2. 没有初始化的对象值是随机的(取决于编译器)
pengzhixi 2010-12-09
  • 打赏
  • 举报
回复
vs貌似是这样,其他的编译器就不清楚

65,165

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧