C++学习:malloc/free和new/delete动态内存分配

C++学习:malloc/free和new/delete


简介:
在C语言中,内存的申请和释放采用的是malloc/calloc/realloc/free来实现的,而在C++语言中,不仅可以使用以上的一些函数,而且可以采用new/delete的形式来进行内存的申请和释放.那么这两种不同的申请和释放到底有哪些优缺点呢?同样他们操作的都是堆内存.又有哪些区别呢?


提示

博主:章飞_906285288
博客地址:http://blog.csdn.net/qq_29924041


C语言已经有了malloc/free,那为什么又要在C++中增加new/delete呢?

  1. malloc和free是C++/C提供的标准库函数,而new/delete则是C++运算符,注意:一个是函数,一个是运算符,这就早就了他们处理的时期不一样

  2. C语言的函数包括程序,都是一种静态链编的过程,而C++程序则强调的是动态联编(注意:一个强调的是编译时,一个强调的运行时)

  3. 对于非内部数据类型(基本数据类型)的对象的时候,光是malloc/free并不能满足动态对象的要求,因为这是运行时的,对象创建和消亡的同时需要调用构造函数和析构函数.而malloc和free是库函数,因此并不在编译器的控制范围之内.注意:new/delete是操作符,不是函数

  4. 对于基本数据类型(内部数据类型)因为他们并没有构造和析构的过程,因此这个时候new/delete和malloc/free的效果是等价的

  5. 虽然在某些情况下(内部数据类型),malloc/free以及new/delete之间是可以相互调用的(不推荐使用),因为如果free掉”new创建的对象的时候”,可能因为无法执行析构函数而导致整个程序的出错

  6. malloc/free以及new/delete必须是要配对使用的

  7. malloc/free和new/delete都是操作的是堆内存,注意:栈内存的申请释放都是系统自己控制的

  8. 运行时操作对象比编译时要好,因此在C++中new/delete要比malloc/free要好,但是并不能摈弃掉malloc/free是因为C++有时候需要去调用C的程序,因此不能摈弃

     如:在C语言中我们定义一个数组:
         char *array = (char*)malloc(10);
         //这个时候是在编译时候完成的,不管我们有没有用到10个字节,系统都会申请分配10个字节
         C++中:
         char temp[20];
         char *array = new array(strlen(temp)+1);
         strcpy(array,temp);
         这样的话,就避免了对内存的浪费的现象
    

示例代码:

/*
 * ===========================================================================
 *
 *       Filename:  snewstrct.cpp
 *    Description:  
 *        Version:  1.0
 *        Created:  2017年07月03日 22时21分16秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (), 
 *        Company:  
 *
 * ===========================================================================
 */

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace::std;

/* *
 *结构体(可充气的产品)
 * */
struct inflatable{
  char name[20];//产品名字
  float volume;//体积
  double price; //价格
};


void show_inflatable(const inflatable* inf){
  cout << inf->name <<endl;
  cout << inf->volume <<endl;
  cout << inf->price <<endl;
}

int main(int argc,char* argv[]){
  //使用new/delete
  inflatable* inf = new inflatable;
  cout << "Enter name of inflatable item:";
  cin.get(inf->name,20);//(结构体指针的使用,使用->)
  cout << "Enter volumn in cubic feet:";
  cin >> (*inf).volume;   //结构体成员变量的使用(使用.运算符)
  cout <<"Enter price:";
  cin >> inf->price;

  show_inflatable(inf);

  //使用free和malloc来进行(函数调用)
  inflatable* inf_t = (inflatable*)malloc(sizeof(inflatable));
  strcpy(inf_t->name,"气垫床");//使用字符串copy函数
  inf_t->volume = 1.6;
  inf_t->price = 35;
  show_inflatable(inf_t);



  free(inf_t);
  //free(inf);内部数据类型,因为结构体是没有构造函数和析构函数的,(不推荐非配对交叉使用)
  delete inf;

  return 0;
}

对于new/delete在动态运行的时候的优势的代码体现:

/*
 * ===========================================================================
 *
 *       Filename:  deletearray.cpp
 *    Description:  
 *        Version:  1.0
 *        Created:  2017年07月03日 22时40分59秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (), 
 *        Company:  
 *
 * ===========================================================================
 */

#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace::std;


/* *
 *注意:因为name是new出来的对象,所以它的生命周期并不是仅仅限于函数中,需要在外部进行释放
 而array的作用域则仅限于函数内部.随着函数栈的消失而消失
 * */
char* getname(){
  char array[20];
  cout<<"enter getname:";
  cin.get(array,sizeof(array));
  //new出来一个动态长度的内存空间,这样就可以避免对内存的浪费的使用
  char *name = new char[strlen(array)+1];//+1操作表示要增增加一个结束符号,注意new出来的是数组,所以释放需要delete []
  strcpy(name,array);  //将array中的数据copy到name空间中去
  return name;
}


int main(int argc,char *argv[]){

  //C语言中数组的声明定义,这种缺陷就是,无论我们有没有用到20个字节的空间,系统都会为我们分配20个空间
  //这样无形之中就会造成内存的浪费
  char array[20];
  cout << "Enter a name:";
  cin.get(array,sizeof(array));
  cout<< "array:"<<array<<endl;
  cin.get();//主要是为了将结束符读取出来

  char *name;
  name = getname();

  cout<<"name:" << name << endl;
  delete [] name;

  return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值