sgi的STL下载地址:: https://sourceforge.net/projects/stlport/
P45
看到里::operator new
所以区分一下new和 operator new;
new运算符为C++ 类对象分配内存时,将在分配内存后调用对象的构造函数,在std作用域内,
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 通常这样声明:
void * operator new(size_t size);
STL源码剖析P45页 对于operator的用法:
T* tmp=(T*)(::operator new((size_t)(size* sizeof(T))));
//我不太懂….为啥要把sizeof返回值转换成size指针…sizeof返回值就是size_t
STL源码剖析P49
一般来说,c++中内存配置操作和释放操作
class Foo{....};
Foo* pf=new Foo;
delete pf;
为了精细分工,STL 将两个操作分开
内存配置由 alloc::allocator()负责,内存释放由alloc::deallocate()负责
对象构造由::construct()负责,对象析够由::destroy()负责
placement new
placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本.
如果你想在已经分配的内存中创建一个对象,使用new是不行的。也就是说placement new允许你在一个已经分配好的内存中(栈或堆中)构造一个新的对象。原型中void*p实际上就是指向一个已经分配好的内存缓冲区的的首地址。
使用方法:
缓冲区提前分配
可以使用堆的空间,也可以使用栈的空间,所以分配方式有如下两种:
class MyClass {…};
char *buf=new char[N*sizeof(MyClass)+ sizeof(int) ] ; 或者char buf[N*sizeof(MyClass)+ sizeof(int) ];
对象的构造
MyClass * pClass=new(buf) MyClass;
对象的销毁
一旦这个对象使用完毕,你必须显式的调用类的析构函数进行销毁对象。但此时内存空间不会被释放,以便其他的对象的构造。
pClass->~MyClass();
内存的释放
如果缓冲区在堆中,那么调用delete[] buf;进行内存的释放;如果在栈中,那么在其作用域内有效,跳出作用域,内存自动释放。