為什麼高版本的編譯器在使用calloc的時候有類似呼叫建構函式的環節,但是malloc始終沒有?

時間 2021-06-03 00:29:48

1樓:

正如 @Milo Yip 大佬所說,對於非pod型別,它們可能有自己的建構函式,虛表等,不能單用malloc這樣粗暴的方法,應該通過c++關鍵字new來使它初始化,它不僅僅構造物件,同時也構造虛表(如果有的話)。

乙個常見的問題是,vs下有人經常會ZeroMemory清空乙個容器,如vector,容器依舊可以使用,但是取迭代器時會彈出迭代器不匹配的assert,原因是不能通過c函式來修改整個類,這樣很危險,還讓人費解,在xcode下編譯器會友好地給出warning。

所以c++的類還是老老實實用new吧。

2樓:Milo Yip

就如 @vczh 所說,一些 std::string 實現的建構函式剛好是把某些成員變數清零,所以剛好能跑,實在上是未定義行為。

如要用 malloc() 來為非 POD 的類分配記憶體,應該用 placement new 去自行呼叫建構函式:

item_t*a

=new

((item_t*)

malloc

(sizeof

(item_t

)))item_t

;// ...

a->~

item_t

();free(a);

為什麼經常聽人說編譯器比你聰明?

其實沒我聰明,我沒見過哪個編譯器能把判斷是否是 2 的冪的迴圈寫法,優化成 n n 1 的 doge 關於 人的優勢是知道的多 這一點,現在的編譯器通過inlining和LTO來擴大分析範圍,還是可以作出更多優化的。有時求解非常複雜的約束關係來進行優化,也有https r 這種基於Z3的優化器。 不...

C C 主流編譯器為什麼不做成debug模式編譯的程式檢查陣列越界 溢位等錯誤,release模式編譯的程式不檢查?

看錯問題了 debug模式,VC可以檢查指向棧上物件的指標是否越界 對於new或者malloc出來的堆上的資料,就沒法判斷了 根源在於,C C 並沒有規範規定new或malloc出來的空間前後需要有什麼樣的標記,new甚至可以過載使得分配記憶體在自己預申請的空間內,或者這個空間甚至根本不是C C 系...

我們為什麼不能開發乙個漢語的編譯器,類似C ,java?

yyf 首先,說下我是個剛開始學習的小白 大神給些同情 我也不是標準的程式設計師,我只是萬千人中最平常的那乙個。有人說沒有必要,因為別人的成果已經很好了,我們再來開發不是浪費時間麼!但是,我想說的是,作為底層的一些東西還是自己的好。用漢語做語法,最起碼中中國人會感到親近,沒有看著就頭大的感覺,而且,...