[转]Visual C++ RunTime的特征——非烫即屯

Visual C++ RunTime的特征——非烫即屯

大一刚学C语言,第二次上机课,当我发现我照着书抄写的程序在运行之外的黑框里面跳出一排“烫烫烫烫烫”,当时就震惊了。你们能想象一个来自小城, 在大学之前没有怎么接触过电脑更不懂代码的孩子当时内心的恐惧吗?我真的以为是这是电脑过热发出来的警告,于是我弯下腰把插头拔了。
——————————————————————————————

VC runtime debug version会把stack初始化成0xcc,unicode中0xcccc(双字节)就是中文的烫。如果你开了个char[],然后最后一个字符忘了 设置成0x00,然后去printf这个字符,那么整个stack从这个局部字符数组开始都输出到console,就变成了“烫烫烫烫烫”。

为啥把stack初始化成0xcc而不是0x00呢?是因为0xcc 在intel x86芯片指令集中代表int 3,也就是debug中断,该指令会自动把程序停在单步调试状态,然后去寻找系统中注册的调试器,如果找不到调试器,那么就会终止程序。这一开始是为了调 试栈缓冲溢出错误的。如果出现溢出,并且代码尝试执行缓冲中的指令,就会进入单步调试状态。

这是debug version, 那么release verion呢?发布版会把栈初始化成0xcd,这个就是imm8,就是立即中断退出的意思。这时候因为运行在用户机器上,没有调试器,也不希望用户来调试你的程序。0xcdcd就是中文的“屯”字。你会看见一些写的超烂的程序经常会出现“屯屯屯屯屯屯”。的确挺屯的,F。

在今天这个芯片DEP,操作系统NX锁定双保险的时代,这种初始化已经没有啥必要了,这个烫屯还存在纯粹是历史原因。

所以在俺们那个电脑还比较古早的年代,说人人品不好,那叫非奸即盗。说程序写的烂,那叫非烫即屯。

参考:
http://www.ccthere.com/article/4019197

——————————————————————————————

通过实测,我认为确实如上所说,所以自己必须要在构造函数中初始化。
如果没有初始化就会出事情(就会默认初始化成0xcdcdcdcd),比如在.h文件中定义:
int* m_test;

在析构函数里写上:
MyClass::~MyClass()
{
if (m_test)
delete m_test;
}
天杀的,居然会执行delete语句,然后程序报错,所以同志们要千万小心啊!!

——————————————————————————————

int xxx;
printf(" xxx = %d", xxx);
int* ddd;
printf("%d", ddd);
ddd = new int(10);
printf("%d", ddd);
上 面这段代码Debug模式下的运行结果是,xxx是一个随机值1366087313(每次运行还是固定值,估计是OS整体内存使用情况不变的缘 故),ddd的值是随机值0x00000100(每次运行还是固定值),但是m_test的值是0xcdcdcdcd,不是0xcccccccc,不知道 为什么(问题1)。
后来又运行了几个软件,这时xxx的值变成了255841937,但ddd的值仍是0x00000100(问题2)。

注:以上调试都是VS2008sp1 + Qt程序下调试。

 

【原文地址:http://www.cnblogs.com/findumars/p/4003800.html】

转载于:https://www.cnblogs.com/vanwoos/p/4593212.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ Runtime Library是一套用于支持C++程序运行的库文件。在C++编程中,我们经常使用的一些函数,比如输入输出函数、字符串处理函数等,都属于C++ Runtime Library的一部分。这些库文件包含了标准的C++函数和类,可以提供给我们在程序中使用。在Visual Studio中,我们可以通过选择C/C++运行库来指定使用哪个版本的C++ Runtime Library。\[1\]\[2\] 当在使用某个软件时出现Microsoft Visual C++ Runtime Library Runtime Error错误,通常是由于软件与C++ Runtime Library之间的冲突导致的。这种错误可能以多种方式出现,比如程序崩溃、自动关闭等。解决这个问题的方法通常是联系软件的支持团队,以获取更多的信息和解决方案。\[3\] #### 引用[.reference_title] - *1* [选择正确的C/C++ runtime library](https://blog.csdn.net/weixin_30731287/article/details/98864516)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [CRT(C Runtime Library)—— C/C++运行时库](https://blog.csdn.net/lanchunhui/article/details/52566263)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Microsoft Visual C++ Runtime Library Runtime Error的解决办法](https://blog.csdn.net/m0_54409538/article/details/124420440)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值