浅析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++开发DLL中使用new和delete注意事项

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

【C++】 深入探究 new 和 delete

在C++中,我们应该经常会用到new、delete,它们是C++的一个关键字,同时也是一个操作符,下面我将我对这两者的了解和学习做一个总结和探讨。new和delete的全过程首先我们定义一个对象A: ...
  • codedoctor
  • codedoctor
  • 2017年07月27日 14:29
  • 586

C++的new 和 delete 操作符重载。

测试代码: // test.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include using name...
  • chjjunking
  • chjjunking
  • 2014年03月04日 12:16
  • 2757

c++详解【new和delete】

说起new和delete,了解过c++的人应该都知道吧,它是用来分配内存和释放内存的两个操作符。与c语言中的malloc和free类似。 c语言中使用malloc/calloc/realloc/fr...
  • xxpresent
  • xxpresent
  • 2016年11月21日 09:22
  • 1626

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

在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么...
  • zyazky
  • zyazky
  • 2016年09月22日 22:24
  • 901

面试题:C++有了malloc/free,为什么还需要new、delete?

1、面试宝典面试题(P81):C++有了malloc/free,为什么还需要new、delete? malloc与free是C、C++语言的标准库函数,new/delete是C++的运算符。他们都用...
  • qq_22522121
  • qq_22522121
  • 2015年03月18日 22:20
  • 872

【七】C++一些新的关键字 -- new、delete、强制类型转换

1、动态内存分配C++中的动态内存分配已经和C语言有了明显区别: C++中通过new关键字进行动态内存申请 C++中的动态内存申请是基于类型进行的 delete关键字用于内存释放   变量申请和释放...
  • CMbug
  • CMbug
  • 2015年08月23日 14:55
  • 1154

qt中new与delete的使用

qt中有时候使用new后并没有使用delete,原因是 Qt 自动回收是靠父子关系。父亲销毁了。他的孩子也销毁。 #include "mainwindow.h" #include #...
  • u012803067
  • u012803067
  • 2017年03月31日 11:10
  • 737

浅谈 C++ 中的 new/delete 和 new[]/delete[]

在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么时候...
  • hazir
  • hazir
  • 2014年03月17日 22:49
  • 99537

C++类和new、delete操作符和堆和栈内存的分配

如果你是Java、C#、PHP程序员,那么会对 new 非常熟悉,在这些编程语言中,只能通过 new 来创建对象。 在C++中,你可以像定义变量一样来创建对象,如: Student stu...
  • u011068702
  • u011068702
  • 2016年07月24日 01:28
  • 784
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅析C++中的 new 与 delete 操作
举报原因:
原因补充:

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