您的位置:首页 > 其它

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

2017-09-23 17:45 281 查看
一、内存开辟

        在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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: