more effective c++笔记2-----Item M8:理 解各种不同含义的new和delete

一.说在前面的话

1.new operator:new 是一个操作符

2.operator new:new 操作符在进行内存分配时所调用的函数,通过这个函数来最终完成内存的分配,函数operator new 通常这样声明:void * operator new(size_t size),注意返回的是一个void*类型,但这个函数与普通函数又有些区别,他是一个重载操作符函数,类似于 bool Carrot::operator==(const Carrot& var)这样子.有关操作符重载点我

3.new[ ] operator 和 operator new[ ] 行为和上面一致,只不过这是为数组分配内存。


二. 摘录

当你写这样的代码:string *ps = new string("Memory Management");

你使用的new 是new operator。这个operator就象sizeof一样是语言内置的,你不能改变它的含义,它的功能总是一样的。它要完成的功能分成两部分。第一部分是分配足够的内存以便容纳所需类型的对象。第二部分是它调用构造函数初始化内存中的对象。new操作符总是做这两件事情,你不能以任何方式改变它的行为。new operator调用一个函数来完成必需的内存分配,你能够重写或重载这个函数来改变它的行为,new操作符为分配内存所调用函数的名字是operator new.

就象malloc一样,operator new的职责只是分配内存。它对构造函数一无所知。operator new所了解的是内存分配。把operator new 返回的未经处理的指针传递给一个对象是new操作符的工作。当你的编译器遇见这样的语句:

string *ps = new string("Memory Management");

这句代码或多或少与下面的代码相似:

void *memory = operator new(sizeof(string));	// 得到未经处理的内存为String对象
call string::string("Memory Management")	// 初始化 *memory内存中的对象
string *ps = static_cast<string*>(memory);	// 使ps指针指向分配好得内存地址


三.演示程序:

// 自己定制 operator new 和 operator delete 函数,实现比较简陋.
void* operator new(size_t size)
{
	void* p = NULL;
	p = malloc(size);
	return p;
}

void operator delete(void* ptr)
{
	free(ptr);		// 内存释放
}
// 自己定制 operator new[] 和 operator delete[] 函数,实现和上面是一致的
void* operator new[](size_t size)
{
	void* p = NULL;
	p = malloc(size);
	return p;
}
void operator delete[](void* ptr)
{
	// 内存释放
	free(ptr);
}
int _tmain(int argc, _TCHAR* argv[])
{

	char* buffer1 = new char[100];	// 自动调用 operator new(100),
	delete[] buffer1;				// 自动调用 operator delete(buffer2)


	// 下面这段代码会自动调用 operator new(sizeof(type))函数, 同时还会进入string对象的构造函数.
	// 这也验证了new operator的2个固定作用:自动调用operator new函数和对象的构造函数。
	// delete operator 除了释放分配的内存以为还会调用string对象的析构函数.
	string* buffer2 = new string("hello world");
	delete buffer2;								
												

	// 直接调用operator new函数,如果有定制则进入定制的operator new函数
	void* buffer3 = operator new(10);
	operator delete(buffer3);	

	// 题外话
	// 1.下面段代码除了分配20个字节内存外,还会进入一段汇编代码将这段内存内容全部置为0
	// 1.和memset(buffer4,0,20)同样的作用,我个人尤其偏爱这样写 :)
	char* buffer4 = new char[20]();
	delete[] buffer4; 

	return 0;
}



三.总结

你想在heap(堆)上建立一个对象,应该用new operator,它既分配内存又为对象调用构造函数。如果你仅仅想分配内存,就应该调用operator new函数,它不会调用构造函数,如果你想定制自己的在heap对象被建立时的内存分配过程,你应该写你自己的operator new函数,然后使用new操作符,new操作符会调用你定制的operator new(这句话的意思是:如果你定制了自己的operator new 函数(全局),当我们使用new operator时,系统会自动去调用你定制operator new 函数来分配内存,否则将调用默认的operator new函数),如果你想在一块已经获得指针的内存里建立一个对象,应该用placement new(关于 placement new的知识请查阅原文)。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值