使用類 結構體時關於ZeroMomery用法錯誤

2021-09-08 17:07:22 字數 788 閱讀 4047

今天同事在寫了如下結構體:

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 在預設狀態下,結構體...