首页 > 编程语言 > 详细

c++中的new和delete

时间:2016-03-05 22:06:59      阅读:399      评论:0      收藏:0      [点我收藏+]

我们都知道在c++中可以用new/malloc动态分配内存空间用delete/free释放动态开辟的内存空间。

c++中的malloc/free是继承c语言中的malloc/free,它的用法和在C语言中的用法一模一样。

 

那么既然c++中有了可以动态开辟内存的函数为什么又要有new/delete呢?

我们知道malloc只是单纯的开辟内存空间而不进行初始化,free只是将动态开辟的内存空间给释放了。

对于内置类型而言,用malloc/free开辟和释放内存没有一点问题,但是对于非内置类型来说,由于对象在创建的时候要调用构造函数进行初始化,而在对象在消亡的时候要调用析构函数进行一些清理工作,显然,malloc/free无法完成这些事情。

因此,c++中提供了new/delete两个操作符,用new在动态分配内存的时候调用构造函数进行初始化,delete在释放内存的时候自动调用析构函数进行清理。

 

new/delete的用法

A为内置类型

class A
{
public:
     A()
     {
          cout << "A()"<<endl;
     }
     ~A()
     {
          cout << "~A()" << endl;
     }
private:
     int _a;
};

技术分享

注意:

new和delete,new[]和delete[]一定要成对出现,在下面我们会解释为什么new[]和delete[]要成对出现。

 

new和delete的内部实现:

通过跟踪调试程序,我们可以知道new和delete内部是通过调用一些函数实现的。

 

new内部是通过调用以下函数实现的

char *  operatoer new(size_t size);

char * operator new[](size_t size);

 

具体调用顺序如下:技术分享

delete内部是通过调用以下两个函数实现的:

void operator delete(char *p);

void operator delete(char *p);

 

具体调用顺序如下:

技术分享

 

new和delete,new[]和delete[]为什么要配对出现?

new/delete和malloc/free是一样的,为防止内存泄漏,一定要成对出现。

而new[]和delete[]为什么要成对出现呢?我们通过执行程序可以发现:

 

 

1.当我们用new[]开辟10个连续内置类型空间,而用delete释放,这时执行程序,程序不会崩溃。

int *p=new int[10];

delete p;

2.当我们用new[]开辟10个连续的非内置类型的空间,没有用delete[]释放,执行程序时,程序会崩溃。

A* pa=new A[10];

delete pa;

这是为什么呢?

 

当我们执行下面的程序,

我们发现执行

int *p=new int[10]开辟内存时传给operator new[](size_t count)的count是40;

技术分享

A* pa=new A[10]开辟内存时传给operator new[](size_t count)的count是84;

技术分享

 

 

 

 

c++中的new和delete

原文:http://haipi.blog.51cto.com/10778780/1747927

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!