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