一秋草木

Nothing Is Impossiable!
posts - 11, comments - 10, trackbacks - 0, articles - 2
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

内置式new (The Placement New Expression)

Posted on 2006-08-11 14:18 一秋草木 阅读(1339) 评论(4)  编辑 收藏 引用 所属分类: C++

1.          概念描述

在已经分配的动态内存空间上使用 new 创建新的对象。这种形式的 new 表达式就是 placement new expression

 

2.          使用格式

new(place_address) type_specifier

        place_address ,已经开辟空间的指针

        type_specifier ,新分配对象的类型

 

3.          实例

int *pBuff  = new int[1000];

long *pb   = new(pBuff) long;     // 即将 pBuff 内的一块大小为 sizeof(long) 的内存区域的

                                                                 // 使用权给 pb 指向的对象。

 

4.          使用注意

        需要

#include<new>

        不需要

delete pb                    // 因为并没有为 pb 开辟一块内存。 pb 指向的对象只有使用权

如果使用

delete []pBuff;              // 意味着其内存空间上的所有对象都被 kill

Feedback

# re: 内置式new (The Placement New Expression)  回复  更多评论   

2006-08-14 16:14 by 沐枫
内置式new,不是一个好的(甚至是不正确的)译法。
曾有人提过:就地创建。但有人不喜欢“就地”两字。
所以,不喜欢的话,如没有适当的译法,还是用placement new这样的原文比较好。

# re: 内置式new (The Placement New Expression)  回复  更多评论   

2006-08-14 17:44 by 一秋草木
谢谢指点。

找了很多地方,发现候捷的书上这么译的,所以copy过来了。

# re: 内置式new (The Placement New Expression)  回复  更多评论   

2006-08-16 14:50 by Squirrel
Exceptional C++ Style上译成 "定位new" 感觉比较合适.

# re: 内置式new (The Placement New Expression)  回复  更多评论   

2006-08-22 17:16 by yihao
C++中没有直接调用构造函数的方法,
Placement New可以间接调用构造函数。
如果 pb是类指针的话还是需要调用析构函数的。

char *pBuff = new char[sizeof(string)];

string *pb = new(pBuff) string("call construct");

////////////////

pb->~string();
pb = 0;
delete[] pBuff;
pBuff = 0;

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理