about:placement new

sunyong 2005-02-25 01:12:56
> 其中的new(__p) _Tp(__val)我很不理解?

這種 new 稱為 placement new。在 C++ Primer 3/e 8.4.5節可以查到,Thinking in C++ 上應該也有描述。
意思是,在一塊 allocated memory(由例中的 __p 指向)取足夠空間建構一個新的 object,並以 __val 為初值。
而不像一般的 new 在操作當時才從 heap 中分配空間。

使用它之前,必須先 #include <new>。

#include <new>
class Foo;
...
char* buf = new char[500]; // 分配一塊空間,500 bytes
Foo* pb1 = new(buf) Foo(abc); // 從 buf 所指空間開始,建構一個 Foo object(將耗用 sizeof(Foo)),以 abc 為初值。
buf += sizeof(Foo); // 移動 pointer
Foo* pb2 = new(buf) Foo(def); // 從 buf 所指空間開始,建構一個 Foo object(將耗用 sizeof(Foo)),以 def 為初值。

-- 侯捷


----- Original Message -----
From: sunyong
To: jjhou
Sent: Thursday, February 24, 2005 3:20 PM
Subject: about:new(__p) _Tp(__val)


侯先生,你好:
我在stl_alloc.h文件中看到这么一行代码
void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }
其中的new(__p) _Tp(__val)我很不理解?我也自己做了个例子,结果也
不能编译。能否帮忙解释一下?

孙永

Best regards,
...全文
121 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
healer_kx 2005-02-25
  • 打赏
  • 举报
回复
见STL源码剖析二三章, 关键在于显示的调用你的构造函数, 但是又不malloc。
寻开心 2005-02-25
  • 打赏
  • 举报
回复
不完全一样, placement 不仅仅是把对象的定位在制定的内存,而且在该位置完成了对象的初始化工作呢
Wolf0403 2005-02-25
  • 打赏
  • 举报
回复
通常类似

void * operator new ( size_t _sz, void * p )
{
return p;
}
寻开心 2005-02-25
  • 打赏
  • 举报
回复
在msdn上面看 How new Works 这个index
注意placement只有对用户自己定义的类型才有用,对于float,char,int之类的没有用途
寻开心 2005-02-25
  • 打赏
  • 举报
回复
msdn上面的原始例子啊

#include <malloc.h>
#include <memory.h>

class Blanks
{
public:
Blanks(){}
void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
void *pvTemp = malloc( stAllocateBlock );
if( pvTemp != 0 )
memset( pvTemp, chInit, stAllocateBlock );
return pvTemp;
}
int main()
{
Blanks *a5 = new( 0xa5 ) Blanks;

return a5 != 0;
}
redleaves 2005-02-25
  • 打赏
  • 举报
回复
这种new实际上就是帮你调用构造函数.它不为你分配内存空间,你要自己先为你要new的对象分配足够的空间,并且持有它,一直到你new的对象销毁.

调用方法.
new(内存块首地址) 类型

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧