[Geedband]第五周学习笔记

new operator

(1)调用operator new分配足够的空间,并调用相关对象的构造函数

(2)不可以被重载

operator new

(1)只分配所要求的空间,不调用相关对象的构造函数。当无法满足所要求分配的空间时,则

->如果有new_handler,则调用new_handler,否则

->如果没要求不抛出异常(以nothrow参数表达),则执行bad_alloc异常,否则

->返回0

(2)可以被重载

(3)重载时,返回类型必须声明为void*

(4)重载时,第一个参数类型必须为表达要求分配空间的大小(字节),类型为size_t

(5)重载时,可以带其它参数

operator new():指对new的重载形式,它是一个函数,并不是运算符。对于operator new来说,分为全局重载和类重载,全局重载是void* ::operator new(size_t size),在类中重载形式 void* A::operator new(size_t size)。还要注意的是这里的operator new()完成的操作一般只是分配内存,事实上系统默认的全局::operator new(size_t size)也只是调用malloc分配内存,并且返回一个void*指针。而构造函数的调用(如果需要)是在new运算符中完成的。

operator new的三种形式:

operator new有三种形式:

throwing (1)void* operator new (std::size_t size) throw (std::bad_alloc);

nothrow (2)void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw();

placement (3)void* operator new (std::size_t size, void* ptr) throw();

(1)(2)的区别仅是是否抛出异常,当分配失败时,前者会抛出bad_alloc异常,后者返回null,不会抛出异常。它们都分配一个固定大小的连续内存。

用法示例:

A* a = new A; //调用throwing(1)

A* a = new(std::nothrow) A; //调用nothrow(2)

(3)是placement new,它也是对operator new的一个重载,定义于中,它多接收一个ptr参数,但它只是简单地返回ptr。

new 、operator new 和 placement new 区别

(1)new :不能被重载,其行为总是一致的。它先调用operator new分配内存,然后调用构造函数初始化那段内存。

new 操作符的执行过程:

1. 调用operator new分配内存 ;

2. 调用构造函数生成类对象;

3. 返回相应指针。

(2)operator new:要实现不同的内存分配行为,应该重载operator new,而不是new。

operator new就像operator + 一样,是可以重载的。如果类中没有重载operator new,那么调用的就是全局的::operator new来完成堆的分配。同理,operator new[]、operator delete、operator delete[]也是可以重载的。

(3)placement new:只是operator new重载的一个版本。它并不分配内存,只是返回指向已经分配好的某段内存的一个指针。因此不能删除它,但需要调用对象的析构函数。

如果你想在已经分配的内存中创建一个对象,使用new时行不通的。也就是说placement new允许你在一个已经分配好的内存中(栈或者堆中)构造一个新的对象。原型中void* p实际上就是指向一个已经分配好的内存缓冲区的的首地址。

delete 与 delete operator类似。

你可能感兴趣的:([Geedband]第五周学习笔记)