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; 应该就可以了吧
不知道 这里 我总结的有没有错误
或者什么遗漏的,
希望广大 大虾 说说你们的看法
谢谢了