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