当前位置:C++技术网 > 资讯 > C++中new 关键字 与C中malloc 关键字的浅析

C++中new 关键字 与C中malloc 关键字的浅析

更新时间:2015-09-11 17:40:39浏览次数:1+次

    在《学习心得之六,MFC编程中两种文件对话框的浅出》一文中,我们为了实现读取电脑上的文件写入了一行代码:

    

 pBuf=new char[dwfilelen+1];
    并且简要解释了一下这行代码,就是根据我们写入的文件动态分配内存,为了解释这行代码,我还写了一行代码:


    

char buf[100] 与 char buf = new char [100];
  我说了这两句代码表示的意思是一样的,都是分配100的内存。我想其实你还是有点迷惑,对不对?不管有没有,今天这篇文章就是详细解释动态分配的,好好理解哦。


    在C语言中,我们用malloc(unsignedintnum_bytes)函数来动态分配内存。这是在堆上分配的,我们知道,堆上的内存是随着程序的终结而结束的,而不是程序块!插一句,堆是什么?其实很好理解,电脑硬件底层中能够动态地(运行时)进行内存分配,并且可以通过任意的顺序释放的记忆区域,就是堆。可是我们为什么用进行动态分配呢?内存不足与内存浪费!就是最好的解释。

    

if(IDOK==fileDlg.DoModal())
 {
  CFile file(fileDlg.GetFileName(),CFile::modeRead);
  char *pBuf;
  DWORD dwfilelen;
  dwfilelen=file.GetLength();
  pBuf=new char[dwfilelen+1];//////////////////修改的代码
  pBuf[dwfilelen]=0;
  file.Read(pBuf,dwfilelen);
  MessageBox(pBuf);
  file.Close();
 }        


   

    这是文章心得6里面的代码,之所以拿过,就是详析字符数组如何动态分配!首先我们定义了一个字符指针pBuf,而不是然后就是动态分配了,我知道,你有疑问!我们只是定义了一个指针,如何对它进行内存分配?又不是数组!额......在这里,其实这是行得通的,否则怎么通过编译。废话少说,我们开始正题。当我们访问某个数组buf(我们这里就是字符数组)的成员时,都是调用buf[i],同时我们也学过 buf[i]与 *(buf+i)是等价的,别告诉我,你C语言老师没教过,要不就是你上课睡着了,不过没事,看到这里你知道了。对于后者,我们知道就是内存块的移动,数组名是首地址,当我们访问buf[i]时就是将首地址向下移动i个单位。

 

char *pBuf;
pBuf=new char[64];

       

char pBuf[64];    


    两者的意思是一样的,前者先在内存中分配pBuf的内存,不过内存太小,接着,用new 来给它增加内存;后者就是直接一步到位给它足够的内存。我想,你看着前者的代码,怎么都会不顺眼,不习惯,还是觉得不太不可能,也不理解。接着看C中的malloc()函数动态分配的例子,你就会理解点了。

    

BookData *book_data_p;

typedef struct BookData_tag{
     char title[64];/*书名*/
     int price;/*价格*/
     ......
}BookData;


BookData *book_data_p;

typedef struct BookData_tag{
     char *title;/*书名*/
     int price;/*价格*/
     ......
}BookData;

book_data_p->title=malloc(sizeof(char)*len)  /////////len是我们输入的书名的长度

    这两者是等价的,我们可以看到当我们调用malloc(unsignedintnum_bytes)时,它的参数是字节数,而我们这上面的代码中,首先我们调用sizeof()函数求得char的大小也就是字节数,然后乘上长度,得到总字节数。

    

char *pBuf;
pBuf=new char[64];


    因此,这句代码,我们可以理解为,等号右边的代码在程序调用了new时,给我们分配内存,分配多少呢?就是程序接下去读的了,接下来就是类型char 的字节数以及长度。有不少人认为C++是C的超集,我觉得也对,毕竟C++基于C,因此C++中某个函数的理解,我们可以在C中找到类似的函数,先理解了它,再迁移到C++中的函数。