有一定
C
開發(fā)經(jīng)驗(yàn)的同學(xué)大多數(shù)踩過
內(nèi)存破壞的坑,有這么幾種現(xiàn)象:
- 比如某個(gè)變量整形,在程序中只可能初始化或者賦值為
1
或者2
, 但是在使用的時(shí)候卻發(fā)現(xiàn)其為0
或者其他的情況。對于其他類型,比如字符串等,可能出現(xiàn)了一種出乎意料
的值! - 程序在堆上申請內(nèi)存或者釋放內(nèi)存的時(shí)候,在內(nèi)存充足的情況下,居然出現(xiàn)了堆錯(cuò)誤。
當(dāng)出現(xiàn)以上場景的時(shí)候,你該思考一下,是不是出現(xiàn)了內(nèi)存破壞的情況了。而本文主要通過展示和分析常見的三種內(nèi)存破壞導(dǎo)致覆蓋相鄰變量的場景,讓讀者在碰到類似的場景,不至于束手無策。而對于堆上的內(nèi)存破壞,很常見并且棘手的場景,本人將在后續(xù)的文章和大家分享。
1. 內(nèi)存破壞之強(qiáng)制類型轉(zhuǎn)換
大家都知道不匹配的類型強(qiáng)制轉(zhuǎn)換會(huì)帶來一些
bug
,比如
int
和
unsigned int
互相轉(zhuǎn)換,又或者
int
和
__int64
強(qiáng)行轉(zhuǎn)換。是不是每次當(dāng)讀起這類文章起來如雷貫耳,但是當(dāng)自己去寫代碼的時(shí)候還是容易犯錯(cuò)?這也就是為什么
C
容易寫出
坑
的原因,明知可能有錯(cuò),還難以避免。這往往是因?yàn)檎鎸?shí)的項(xiàng)目中復(fù)雜程度,往往讓人容易忽略這些細(xì)節(jié)。不少老的工程代碼還是采用
VC6
編譯,為了安全問題或者使用C 新特性需要將
VC6
升級(jí)到更新的
Visual Studio
。接下來要介紹的一個(gè)樣例程序,就是隱藏于代碼中的一個(gè)問題,如果從
VC6
升級(jí)到
VS2017
的時(shí)候會(huì)帶來問題嗎?可以先找找看:
#include?
#include?
class?DemoClass
{
public:
??DemoClass()?:?m_bInit(true),?m_tRecordTime(0)
??{?
????time((time_t?*)(