c++調試出現“讀取字符串的字符時出錯”,無法讀取內存? 以及malloc函數和new 的區別


最近在學習編寫編譯器時用vs2013遇到一個問題:

使用的malloc函數新創立的結構體 中的string類型出現了問題,即讀取字符串的字符時出錯,無法讀取內存

最后發現是新建節點時出現了錯誤:(C語言中沒有string類 用malloc無法識別)

TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode)); (我copy書中的源碼,用的c語言)

但是為了使用方便,在結構體中使用了string類

 typedef struct treeNode
{
  struct treeNode * child[MAXCHILDREN];
  struct treeNode * sibling;
  TokenType op;
  int val;
  string name;
  ExpKind expkind;
}TreeNode;

所以用C語言的malloc函數無法為string類對象分配正確的內存,因此出現了錯誤

修改使用C++的new函數來創建新的樹節點則問題消失:

TreeNode * t = new TreeNode;

 

網上搜集的資料:

對於非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由於malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加於malloc/free。
因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。
我們不要企圖用malloc/free來完成動態對象的內存管理,應該用new/delete。由於內部數據類型的“對象”沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。

上面的回答解決了我的問題:
結構體中有string類 ,string類的構造函數在malloc時無法執行,出現我上面的問題
new可以認為是malloc函數加構造函數的執行。
參考博文 http://blog.csdn.net/zjc156m/article/details/16819357
http://blog.csdn.net/hazir/article/details/21413833


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM