浅析C++中的 new 与 delete 操作

原创 2006年06月15日 12:30:00

new操作符(new operator)与operator new的关系,你想在堆上建立一个对象,应该用new操作符。它既分配内存又为对象调用构造函数。如果你仅仅想分配内存,就应该调用operator new函数;它不会调用构造函数。如果你想定制自己的在堆对象被建立时的内存分配过程,你应该写你自己的operator new函数,然后使用new操作符,new操作符会调用你定制的operator new。如果你想在一块已经获得指针的内存里建立一个对象,应该用placement new。
 我解释一下上面这段,int a=new int(4); 这句中,new会先调用opertor new(size_t,...)这个函数可以重载,且它的第一个参数只能是size_t(unsigned int)类型,它是专门用来分配内存空间的. 然后调用相应的构造函数来生成对象.
 如果重载了operator new(...) ,再使用 new 时,系统会调用重载过的operator new,下面的代码可供测试:
------------------------------------------
void*operator new(size_t a)
{
 cout<<"reload operator new"<<endl;      
 void*pTemp=malloc(a);
 return pTemp;
}
void main()
{
 int *a=new int(7);         //这里,会打印出一行:reload operator new
}
------------------------------------------
placement new 本身不是一个函数,它只是表示从指定位置的内存中去生成一个对象来.下面的代码可作为一个示例:
------------------------------------------
#include <new.h>                       //要引入头文件new.h
void*operator new(size_t a)
{
 cout<<"reload operator new"<<endl;
 void*pTemp=malloc(a);
 return pTemp;
}
void main()
{
 void *pTemp=operator new (1);    //申请一个空间.
 int *a=new(pTemp)int(8);    //把对象产生在这个空间中.
 cout<<*a<<endl;      //实际实用时,这个内存空间应该是比本示例更有意义的地方.
}
由此可见,placement new 的实际是new 的调用有点特别.

下面说一下delete,与new 一样,delete调用时,会先调用析构函数,然后operator delete 来释放空间,但在上面的placement new中,如果内存不是用operator new/new 得到的,比如对象在栈上或另一个堆对象的内部,则不应该调用delete来释放它.

深入一步谈下数组new 与delete:
 string *ps = new string[10];
     在上面这句代码中,被使用的new仍然是new操作符,但是建立数组时new操作符的行为与单个对象建立有少许不同。第一是内存不再用operator new分配,代替以等同的数组分配函数,叫做operator new[](经常被称为array new)。它与operator new一样能被重载。这就允许你控制数组的内存分配,就象你能控制单个对象内存分配一样. 注意,上面虽然有10个string对象,但operator new[]只会被调用一次,这也就是它相对于operator new的优势所在.下面的代码可简单验证:
void*operator new[](size_t a)
{
 cout<<"reload operator new"<<endl;
 void*pTemp=malloc(a);
 return pTemp;
}
void main()
{
 char *p=new char[7];       //只会打印一次reload operator new.
}
-------------------------------------------------
 另外,在释放数组空间时,使用的是:delete []char; 这里,会调用多次析构函数,再调用一次operator delete[],释放全部内存.下面的代码能很好地演示这一点:
--------------------------------------------------
void*operator new[](size_t a)          //重载数组内存分配函数.
{
 cout<<"reload operator new"<<endl;
 void*pTemp=malloc(a);
 return pTemp;
}
void operator delete[](void*pTemp)     //重载数组内存释放函数.
{
 cout<<"reload delete []"<<endl;
 free(pTemp);
}
class mycls        //定义一个类,实现其构造与析构函数.
{
public:
 mycls();
 ~mycls();
};
mycls::mycls()
{
 cout<<"constructor"<<endl;
}
mycls::~mycls()
{
 cout<<"destructor"<<endl;
}

void main()
{
 mycls *p=new mycls[5];      //这里将调用一次operator new[],五次构造函数
 delete []p;     //这里将调用五次析函数,一次operator delete[]
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

C++中的new与delete简单浅析

#include #include using namespace std; /* 类名:Demo */ class Demo { public: // Demo类的构造函数 Demo(...

C++ 中 malloc/free 与 new/delete 浅析

new/delete 通常来说是操作符,就是"+","-"一样,malloc/free 是 C++/C 语言的标准库函数 —— 本质区别。本文主要从以下5各方面比较、分析 malloc/free,ne...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

第15周项目3-指针的基本操作(new-delete)-输出最值

 问题及代码: /* *Copyright (c)2014,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:numbers.cpp *作 者...

Effective c++ 条款16学习笔记: 成对使用new和delete时要采取相同形式

User the same from in corresponding uses of new and deletes 条款16:User the same from in correspond...

C++基础遗漏:new和delete

C++基础遗漏:new和delete                       &#...

C++中关于new和delete的使用

最近一直在啃 C++ Primer 中文版第4版,发现 C++中new和delete应用遍布全书,现对其使用作简单总结。在C++中,可以使用new和delete动态创建和释放数组或者单个对象,现在对它...

C++笔记(常用关键字new、delete、static、const、friend,operator+-,内存结构)

1.new ,delete //C++ 通过new(delete)动态内存分配 //而C则是通过 malloc(free) Son* s1 = new Son(12); ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)