問題如下:
我定義瞭如下的一個結構體: typedef struct { CString csText; }MyStruct; 並有如下的程序段1: MyStruct * p=NULL; p=(MyStruct *)malloc(sizeof(MyStruct)); if(!p) AfxMessageBox("分配內存失敗!"); else { p->csText="hello world!"; free(p); }執行程序段1,會出現一個內存讀取異常,系統提示程序非法read了一個地址。 程序段2: MyStruct p; p.csText="hello world!";執行程序段2,沒有問題。 我的疑問: (1)爲什麼程序段1會出現內存讀取異常的錯誤而程序段2沒有?
(2) 在我的項目中,需要動態給上述的結構體分配內存,需要怎麼實現? 編程中國論壇c++版主sunkaidong給出的回覆(不勝感激):
1,malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們都可用於申請動態內存和釋放內存。
2,對於非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由於malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加於malloc/free。 3,因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。 4,C++程序經常要調用C函數,而C程序只能用malloc/free管理動態內存 new 是個操作符,和什麼"+","-","="...有一樣的地位. malloc是個分配內存的函數,供你調用的. new是保留字,不需要頭文件支持. malloc需要頭文件庫函數支持. new 建立的是一個對象, malloc分配的是一塊內存. new建立的對象你可以把它當成一個普通的對象,用成員函數訪問,不要直接訪問它的地址空間 malloc分配的是一塊內存區域,就用指針訪問好了,而且還可以在裏面移動指針. #include"AFX.H"
#include "stdio.h" #include"stdlib.h" typedef struct { CString csText; }MyStruct; int main(void) { MyStruct * p=NULL; p=new MyStruct(); if(!p) printf("分配內存失敗!/n"); else { printf("分配內存成功!/n"); p->csText="hello world!"; printf("%s",p->csText); } delete p; system("pause"); return 0; } 對於非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由於malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加於malloc/free。
作爲對比,看下這個: #include"AFX.H" #include "stdio.h" #include"stdlib.h" typedef class { public: CString csText; }MyStruct; int main(void) { MyStruct * p=NULL; p=(MyStruct*)malloc(sizeof(MyStruct)); if(!p) printf("分配內存失敗!/n"); else { printf("分配內存成功!/n"); p->csText="hello world!"; printf("%s",p->csText); } delete p; system("pause"); return 0; } 這個是錯的,只申請了空間沒初始化對象,沒有調用構造函數,沒又構造函數得話,怎麼能說明這個地方存放這個類得實例呢?是是對象實例,那麼你就不能用指針指向,搭建引用,那麼也就沒辦法指向成員了 |
結構體含CString成員
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.