11 关于C++中的new和delete

1、引言

本篇介绍new和delete的内存管理以及operator new/new[]和operator delete/delete[]的重载方法。

2、new的内存分配


注意点:

a、如上图构造一个复数对象,使用new方法,存放指针pc,编译器在构造过程中会分成三个步骤:①分配内存(使用operator new());②转型;③调用构成函数;

b、这个过程的简单理解就是先分配一块内存给声明对象,然后往对象中添加数据。

3、delete的内存管理


注意点:

a、如上图使用delete pc。编译器会转化为两个步骤:①调用析构函数;②释放内存(使用operator delete())。

b、这个过程简单的理解就是先清理数据,再释放指针。

4、关于new和delete的重载

1)头文件示例

class Foo
{
public:
	Foo() :_id(0){ 
		cout << "default ctor.this = " << this << " id = " << _id << "\n";
	}
	Foo(int i) :_id(i){
		cout << "ctor.this = " << this << " id = " << _id << "\n";
	}
	~Foo(){
		cout << "dtor.this = " << this << " id = " << _id << "\n";
	}
	//重载方法
	static void* operator new(size_t size);
	static void operator delete(void* pdead, size_t size);
	static void* operator new[](size_t size);
	static void operator delete[](void* pdead, size_t size);
private:
	int _id;
	long _data;
};

inline
void* Foo::operator new(size_t size){
	Foo* p = (Foo*)malloc(size);
	cout << "operator new(size_t size)" << endl;
	return p;
}

inline
void Foo::operator delete(void* pdead, size_t size){
	cout << "operator delete(void* pdead, size_t size)" << endl;
	free(pdead);
}

inline 
void* Foo::operator new[](size_t size){
	Foo* p = (Foo*)malloc(size);
	cout << "operator new[](size_t size)" << endl;
	return p;
}

inline 
void Foo::operator delete[](void* pdead, size_t size){
	cout << "operator delete[](void* pdead, size_t size)" << endl;
	free(pdead);
}

#endif
2)主程序

int _tmain(int argc, _TCHAR* argv[])
{
	Foo* f = new Foo; //#1
	delete f;	//#2
	cout << "\n";
	Foo* f1 = new Foo[3];  //#3
	delete[] f1;   //#4
	return 0;
}
/*输出结果:
	operator new(size_t size)  //#1
	default ctor.this = 00D52C58 id = 0 //#1
	dtor.this = 00D52C58 id = 0  //#2
	operator delete(void* pdead, size_t size)  //#2

	operator new[](size_t size) //#3
	default ctor.this = 00D51AF4 id = 0 //#3
	default ctor.this = 00D51AFC id = 0 //#3
	default ctor.this = 00D51B04 id = 0 //#3
	dtor.this = 00D51B04 id = 0  //#4
	dtor.this = 00D51AFC id = 0  //#4
	dtor.this = 00D51AF4 id = 0  //#4
	operator delete[](void* pdead, size_t size) //#4
*/

注意点:

a、主程序中#1,构造单一对象f时,会重载operator new()方法(与前面描述new的内存管理中分配内存相关),然后调用构造函数;

b、主程序中#2,当delete f时,会先调用析构函数,然后调用operator delete;

c、主程序中#3,构造数组对象f1时,会重载operator new[]方法,然后调用构造函数(会根据数组个数依次调用);

d、主程序中#4,析构数组对象f1时,会先调用析构函数(会根据数组个数依次调用,顺序与构造函数调用相反),然后调用operator delete[]。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值