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

原创 2013年12月02日 14:27:46
#include <iostream>
#include <cstdlib>

using namespace std;

/*
	类名:Demo
*/
class Demo
{
public:
	// Demo类的构造函数
	Demo(){ cout <<  "Demo()" << endl; }
	// Demo类的析构函数
	~Demo(){ cout << "~Demo()" << endl; }
	// 重载new运算符
	static void* operator new(size_t bytes)
	{ 
		cout << "new Demo" << "\tbytes = " << bytes << endl; 
		if( 0 == bytes ) 
			return NULL;
		void *p = malloc(bytes);
		return p;
	}
	// 重载delete运算符
	static void operator delete(void* addr)
	{ 
		cout << "delete Demo" << endl; 
		if( NULL == addr )
			return;
		free(addr);
	}
	// 重载new[]运算符
	static void* operator new[](size_t bytes)
	{ 
		cout << "new[] Demo" << "\tbytes = " << bytes << endl; 
		if( 0 == bytes ) 
			return NULL;
		void *p = malloc(bytes);
		return p;
	}
	// 重载delete[]运算符
	static void operator delete[](void* addr)
	{ 
		cout << "delete[] Demo" << endl; 
		if( NULL == addr )
			return;
		free(addr);
	}	
}; 
 
// 入口函数
int main()
{
	cout << "===============================================" << endl;
	Demo* p1 = new Demo;	// 1.分配空间;		2.执行构造函数;
	delete p1;				// 1.执行析构函数;	2.释放空间;
	cout << "===============================================" << endl;
	Demo* p2 = new Demo[5];	// 这里会额外分配4个字节来保存分配空间个数
	delete[] p2;
	cout << "===============================================" << endl;
}
/*
	执行结果:
		===============================================
		new Demo	bytes = 1
		Demo()
		~Demo()
		delete Demo
		===============================================
		new[] Demo	bytes = 7 	// 这里会分配额外4个字节来保存分配空间的个数
		Demo()					// 以便通知delete来释放多少个分配空间
		Demo()
		Demo()
		~Demo()
		~Demo()
		~Demo()
		delete[] Demo
		===============================================
*/
分析:从上面程序执行结果可以看出,在C++中分配内存的最小单位为1个字节因为计算机内存分配最小单位为1个字节。当分配一组内存的时候,C++会为分配内存额外开上一个4个字节大小的空间,这多出来的4个字节的空间是为了通知delete应该释放多少个空间。再补充一点:在C++中重载new和delete运算符无论加不加static修饰,C++都会认为是static。
版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

C++new和delete实现原理

new操作 delete操作 new[]操作 delete[]操作
  • passion_wu128
  • passion_wu128
  • 2014年09月01日 02:01
  • 10516

c++的new和delete的方法使用以及不用new定义变量

new和delete运算符用于动态分配和撤销内存的运算符 new用法:           1.     开辟单变量地址空间                1)new int;  //开辟一个存...
  • uestcyao
  • uestcyao
  • 2014年03月24日 16:44
  • 6503

重载new和delete的一些规则

重载new和delete的一些规则重载new和delete的一些规则 一般规则 特殊规则1 特殊规则2 特殊规则3 new和delete重载实例 直接获取当前的new_handler 转载请注明出处参...
  • sanoseiichirou
  • sanoseiichirou
  • 2015年11月20日 23:18
  • 1257

C++的new、delete及其内存管理

代码写多了,就麻木了。new和delete很好用,平时用的时候没想太多。但如果“想太多”就会引发出很多东西。 new和delete跟sizeof一样,是操作符,关键字,而不是函数。new和dele...
  • Kelvin_Yan
  • Kelvin_Yan
  • 2015年01月13日 11:11
  • 1267

c++详解【new和delete】

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

new出的对象数组必须要用delete[]删除,而普通数组和结构数组delete和delete[]都一样

为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-----_CrtMemBlockHeader                            ...
  • Watson2016
  • Watson2016
  • 2016年10月25日 17:06
  • 3100

C++中new和delete在数组指针和指针数组中的调用

首先,先区分下数组指针和
  • u013025310
  • u013025310
  • 2014年05月14日 23:23
  • 3584

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

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

既然有了malloc/free为何还要new/delete?

既然有了malloc/free为何还要new/delete? 最近开发过程中,有个疑问,就是C中已经有了malloc 和free 为何在C++中又有new/delete呢(不负责任的回答是前者是C里面...
  • gggg_ggg
  • gggg_ggg
  • 2015年01月07日 14:09
  • 2324
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中的new与delete简单浅析
举报原因:
原因补充:

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