动态内存开辟--new_delete和malloc_free(十八)

一、内存开辟

        在C++编程中有两种内存开辟方式:

         一种是静态内存开辟空间,这类是在栈中开辟,由编译器在编译程序时就能够确定空间大小,如定义char a;  int b;因为a先定义,b后定义,在栈中a的地址要小,b的地址要大;

         第二种是动态开辟,是在程序运行时需要动态定义空间的大小,通过malloc或new来进行开辟,这部分空间是在堆上进行开辟的,所以在程序结束前需要进行free或delete来进行释放,否则会存在内存泄露。

二、对普通类型malloc_free和new_delete的区别

        对于动态开辟空间有两种方式,一种是malloc,对应的释放空间方式是free,一种是new,对应的释放空间是delete。两种有很多区别,对于普通类型进行开辟空间区别不是很大,主要有一下几种:

       (1)malloc和free是C中定义的开辟空间方式,而new和delete是C++中定义的开辟空间方式,其中底层一般用到的都是malloc和free;

      (2)对于普通类型,malloc定义空间需要给出空间的大小,即字节数,而new可以根据开辟空间的内容自动算出;如malloc(sizeof(int)*10),而new通过new  int[10];

      (3)对于malloc返回的是void*类型,需要进行强制类型转换,如(int*)malloc(sizeof(int)*10),而new直接返回申请空间的类型,如new int[10];

      (4)对于释放,free直接释放指针即可,如free(p),而delete在释放单个普通数据时使用delete q,而如果是释放数组则使用delete []q。

示例如下:

int main(int argc, char** argv){
  int* p = (int*)malloc(sizeof(int)*10);
  for(int i=0; i<10; ++i){
    p[i] = i+1;
  }
  free(p);
 
  int* q = new int[10];
  for(int j=0; j<10; j++){
    q[j]=j+1;
  }
  delete []q;
}

三、对与类类型,malloc_free和new_delete的区别

      两者的区别主要体现在对类类型的空间开辟和释放上,因为new和delete是为C++设计的开辟空间和释放空间的操作符,所以对于类类型有特殊的功能:

      使用new开辟新空间时会先开辟空间,再调用构造函数并对对象进行初始化,使用delete释放空间时会调用析构函数析构对象,再释放空间。

     那么对于自动调用构造函数,对于单个对象在开辟空间时可以传入初始化值对对象进行初始化,对于数组对象,开辟空间无法传入初始化值,所以需要类类型具有默认的构造函数。

实例如下:

#include <iostream>
class Test{
public:
  Test(int d=2):data(d){
    std::cout<<"construct function"<<std::endl;
  }
  ~Test(){
    std::cout<<"free function"<<std::endl;
  }
  void print_data(){
    std::cout<<data<<std::endl;
  }
private:
  int data;
};



#include "new.h"
int main(int argc, char** argv){
  Test* t = (Test*)malloc(sizeof(Test));
  t->print_data();
  free(t);
 
  Test* ta = (Test*)malloc(sizeof(Test)*10);
  (ta+3)->print_data();
  free(ta);
 
  Test* tn = new Test(100);
  tn->print_data();
  delete tn;
 
  Test* tarr = new Test[10];
  tarr[3].print_data();
  delete []tarr;
}










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值