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