今天同事在寫了如下結構體:
1 typedef struct_taginfo
2 info, *pinfo;
67 typedef std::mapmap_info;
8 typedef std::map::iterator map_info_it;
在使用該結構體時
pinfo pinfo = new info();
zeromemory(pinfo, sizeof(info));
pinfo->lst.push_back(1); //此處會出現崩潰,虛函式的指標已經被清零,因此程式執行到這裡會引起崩潰!
原因是如下:
在windows平台下,
陣列或純內建型別(int,char,bool,double,float等型別)結構使用zeromemory是安全的,而類(class)就使用
建構函式進行初始化,不要呼叫zeromemory。
另外,如果乙個類的結構中包含stl模板(vector、list、map等等),那麼使用zeromemory對這個類的物件中進行清零操作也會引起一系列的崩潰問題(
指標指向
記憶體錯誤、
迭代器越界訪問等)。所以,再次強烈建議:類(class)只使用
建構函式進行初始化,不要呼叫zeromemory進行清零操作。
在windows
程式設計中,zeromemory的作用是用0來填充一塊
記憶體區域,主要是你填充一些資料結構時把它們填為0比較保險,因為很多預設的引數取值為null,作業系統會替你解決。
關於結構體
關鍵字struct表示定義的是結構體的資料型別,緊隨其後的識別符號student是結構體型別名。花括號中依次列舉該型別的每個成員資料型別及其名稱,每個成員的資料型別可以是基本資料型別或者自定義資料型別,但是不能重名。結構的成員也成為域。結構體型別的定義以乙個分號結束。由於資料型別僅是為變數分配儲存空...
關於結構體
結構不可以定義無參的建構函式,缺省內置乙個 結構只能定義有參的建構函式,通過建構函式初始所有成員變數 結構可以不使用操作符new來例項化,但是在使用該結構時必須先給所有成員初始化 結構不能繼承,也不能被繼承 結構可以實現介面 結構不能存在受保護的成員,虛成員還有抽象成員 1.結構是值型別的,不是引用...
類與結構體
1.c與c 中結構體的不同 1 c中的結構體不能申明函式,只能申明變數 c 中的結構體和類差不多,能申明資料成員,也能申明函式成員 2 c中的結構體不能進行封裝,而c 中由於是 類 可以進行封裝。2.c 中類與結構體的區別 首先說明c 中類與結構體在一定意義上是等價的 區別 1 在預設狀態下,結構體...