浅析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++ 中 malloc/free 与 new/delete 浅析

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

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

#include #include using namespace std; /* 类名:Demo */ class Demo { public: // Demo类的构造函数 Demo(...
  • cyousui
  • cyousui
  • 2013年12月02日 14:27
  • 478

C++_new_和_delete的整理资料

  • 2012年11月18日 12:49
  • 53KB
  • 下载

c++基础介绍,如delete ,new

  • 2010年01月17日 14:15
  • 907KB
  • 下载

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

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

c++语言,new和delete

  • 2011年11月11日 19:55
  • 839KB
  • 下载

C++内存探讨 New与delete

在windows中,C++中的new与delete操作分析~
  • waykd
  • waykd
  • 2017年10月24日 16:51
  • 41

C++开发DLL中使用new和delete注意事项

报错情况: 1,在 DLL 中用 new 来创建宿主程序中的对象,然后把这个对象指针保存到宿主程序,当 DLL 被卸载后,凡是涉及到这个指针的调用都会报错,包括 delete 这个指针也会有错。 ...
  • dodott
  • dodott
  • 2016年11月11日 18:26
  • 954

C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free .

内存分配方式 内存分配方式有三种: [1] 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量, static 变量。 [2] 在栈上创...

内存泄漏查找c++ new delete

#include #include struct MemIns { void *pMem; int m_nSize; char m_szFileName[256]; ...
  • occupy8
  • occupy8
  • 2016年04月05日 18:52
  • 571
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅析C++中的 new 与 delete 操作
举报原因:
原因补充:

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