登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: c++ 中先分配内存的 new [定位new表达式]     [回主站]     [分站链接]
标题
c++ 中先分配内存的 new [定位new表达式]
clq
浏览(0) + 2010-05-07 14:56:56 发表 编辑

关键字:

c++ 中先分配内存的 new

http://group.gimoo.net/review/83816

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的内存池的部分代码就自然知道怎么弄了。


clq
2010-5-7 15:04:11 发表 编辑

定位new表达式(placement new expressionC++ 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表达式将对象创建在已经被分配好的内存中,完成构造函数的调用。



总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1