2009-06-19 20:40:44 道魔沌乐
多研究一下 std::allocator boost::allocator分配器就知道了。 先用malloc分配一个无类型的,然后用定位new构造对象。 内存管理是算法的问题。 |
2009-06-19 20:56:26 曹雨婷
SGI STL中的对象创建是分两边来进行的, 第一步,分配内存,直接使用包装好的函数分配内存(内部malloc实现) 第二步使用new((void*)MemoryPoint) ClassType(Parameter list); 对对象初始化 对象销毁 第一步:显示调用析构函数objectPoint-〉~ClassType(); 第二步:将内存链接回内存池 上面的东西全部用模板实现 其实你要实现的东西就是stl里面的东西,我建议你看看sgi stl的内存池的部分代码就自然知道怎么弄了。 |
定位new表达式(placement new expression,C++ primer P347), 允许程序员将对象创建在已经被分配好的内存中,new表的式的形式如下:
new (place_address) type
new (palce_address) type (initializer-list)
place_address必须是个指针,指向已经分配好的内存。为 了使用这种形式的new表达式,必须包含头文件<new>。
定位new表达式不能调用delete删 除 placement new的对象,需要人为的调用对象的析构函数,并且人为的释放掉占用的内 存。
#include <iostream>
#include <new>
using namespace std;
const int chunk = 16;
class Foo
{
public:
int val(){return _val;}
Foo(){_val=0;}
private:
int _val;
};
int main()
{
// 预分配内存buf
char *buf = new char[sizeof(Foo) * chunk];
// 在buf中创建一个Foo对象
Foo *pb=new (buf) Foo;
// 检查一个对象是否被放在buf中
if(pb->val()==0) cout<<"new expression worked!"<<endl;
// 这里不存在与定位new表达式匹配的delete表达式,即:delete pb, 其实只是为了
// 释放内存的话,我们不需要这样的表达式,因为定位new表达式并不分配内存。
// 如果在析构函数中要做一些其他的操作呢?就要显示的调用析构函数。
// 当程序不再需要buf时,buf指向的内存被删除,它所包含的任何对象的生命期也就
// 都结束了。
delete[] buf;
return 0;
}
定位new表达式的应用:
在我们的程序中,首先使用malloc为 对象分配空间,然后通过定位new表达式将对象创建在已经被分配好的内存中,完成构造函数的调用。