C++使用new进行内存分配,其过程包含分配地址与在此地址上初始化目标对象。如果只基于申请的目标对象进行内存分配则目光短浅,因为随着时间的推移可能会需要更多的内存空间,如vector容器中元素个数增多。为此C++为那些可能将要分配的对象提前申请了内存空间,到时只要进行对象初始化即可。
考虑内存分配一定要将分配地址与目标对象初始化分开。比如在预先分配的内存上初始化对象,将来这些对象还不一定会用到,而且就算用到时还需再赋值。有的类在分配内存时也不知道初始化的对象是什么,比如容器类。
new表达式分配内存并初始化目标对象,delete表达式调用目标对象析构函数并回收内存。
C++中有两种方法分配未初始化的原始内存。(1)使用allocator类。(2)STL中operator new 和operator delete,不是常见的new和delete表达式。他们各自配有初始化和撤销对象回收内存的方法。
allocator类是一个模版,其内有allocate(分配内存),deallocate(回收内存,
但不负责之前的销毁对象),construct(对象初始化,
使用拷贝构造函数),destruct(仅析构对象)等函数,还有内存填充与内存复制,比如一个vector对象,空间不够时,会新分配内存,用复制函数将原有对象们复制到新地址,再析构原地址上对象,再回收内存。
new,delete表达式(new/delete expression)与operator new和operator delete(此两者书中称之为library function):
它们的关系是 The new-expression allocates storage by calling the appropriate allocation function (operator new 或 operator new[])。
当平时我们使用new表达式时: int *p=new(int); 发生以下三件事情:
(1)调用标准库中的operator new,分配足够大的原始内存
(2)运行目标类型的构造函数,在分配的原始内存上初始化目标对象
(3)返回指向该新分配的目标对象的指针
而delete表达式发生以下两件事情,delete p:
(1)运行指针p所指对象的析构函数
(2)调用标准库中operator delete 回收内存
operator new 和 operator delete 是allocator类中allocate和deallocate的低层次版本。operator new负责 allocate raw/unconstruct memory,不负责 initialize an object。operator delete 只free memory,不destroy an object (即不负责析构)。
还有一种称作 placement new 的表达式,该表达式
不分配内存,接收一个已分配原始内存的指针,并在该地址初始化目标对象。使用方式为:
new (address) Type;
address必须为指针,Type为需初始化的对象类型
注: placement new 表达式可作为allocator中construct的低级调用,其中destruct的低级调用可以通过显式手动调用对象析构函数来实现,
但在此调用对象析构函数只销毁对象,并不回收内存,回收内存用deallocate。
new (sp) string("hello");//sp为已分配好内存的指针
operator new 和 operator delete 可以重载,当我们重载其中一个时,最好也重载另一个。再当我们又想使用系统默认版本时,可以如下:
Type * p=::new(Type);
::delete p;
|
可以参考转载文章,这哥们写的有点深入
http://blog.csdn.net/armman/archive/2007/03/05/1521614.aspx
阅读(540) | 评论(0) | 转发(0) |