分析new delete 的本质

Posted 聊寂园

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分析new delete 的本质相关的知识,希望对你有一定的参考价值。

  在程序设计中,数据可能会存在不同的内存空间,如函数栈 堆   全局变量区  ,今天我们来分析一下C++中堆分配方式和C语言的堆分配方式异同,从而更好的理解new  delete本质

   C语言使用malloc和free来动态分配和释放堆空间,

  void * malloc(size_t);

  void   free(void *);

从函数声明可以看出,使用malloc时,第一:必须显示的把分配的内存空间强制转换成相应的指针类型。第二:必须指定分配字节大小,在不确定基本数据类型字节大小情况下,我们不得不使用sizeof 关键字来计算

     int * p=(int *)malloc(sizeof(int)* 4);

 free(p);

  然而在C++中,一切都简单安全多了。首先我们要了解C++的new和delete关键字是运算符重载operator new  operator delete  ,在用new时,编译器会自动为我们计算出所需要的字节空间大小而不必我们自己去计算,其次如果new 的对象是类类型而不是基本数据类型,分配完堆空间会调用相应的类构造函数完成初始化工作。

  int * p=new int;//随机值

  int * p2=new int(5)//初始化为5

 

  Person * p=new Person;//先分配sizeof(Person)大小空间,在调用构造函数初始化对象

  Person *p=new Person(4,5);//调用有参构造函数

  delete p;//先调用析构函数,在释放空间

  使用new为数组分配动态内存堆空间 ,

  int *p=new int[5];

  Person *pa=new Person[4];

  delete []p;  

  delete []pa;

 

需要注意的是:用new分配数组不能初始化,且如果数组是基本数据类型,delete [] p  ,delete p 可能会产生相同效果,但如果是类类型,delete [] pa,delete pa 是不同的,前者把所有的数组空间都释放掉,而后者仅仅释放到一个对象大小的空间

 

以上是关于分析new delete 的本质的主要内容,如果未能解决你的问题,请参考以下文章

我应该将所有对 new/delete 的调用集中到一个类吗?

C++笔记--面向对象(OOP)编程基础(new/delete类的静态成员c++编译器对象管理模型分析)(3-2)

描述符get/set/delete,init/new/call,元类

C++中的new/delete构造/析构函数dynamic_cast分析

C++ 中的 new/delete 和 new[]/delete[]深入理解

C++ 中的 new/delete 和 new[]/delete[]深入理解