結構體含CString成員

問題如下:
我定義瞭如下的一個結構體:

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;
}
這個是錯的,只申請了空間沒初始化對象,沒有調用構造函數,沒又構造函數得話,怎麼能說明這個地方存放這個類得實例呢?是是對象實例,那麼你就不能用指針指向,搭建引用,那麼也就沒辦法指向成員了
發佈了2 篇原創文章 · 獲贊 68 · 訪問量 116萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章