免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1801 | 回复: 3
打印 上一主题 下一主题

求高人解释这个语句的意思 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-06 06:59 |只看该作者 |倒序浏览

侯捷的 STL源码剖析 P45中的例子有这样一句话:

template <class T1,class T2>
inline void _construct(T1* p,const T2& vlaue) {
    new(p) T1(value); // placement new, invoke ctor of T1
}

我搞不明白“new(p) T1(value); ”是什么意思,有高人能帮助解释一下吗?谢谢

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2012-05-06 07:12 |只看该作者
pls google placement new c++
hopes it will be help.

论坛徽章:
0
3 [报告]
发表于 2012-05-06 09:15 |只看该作者
template <class T1,class T2>
inline void _construct(T1* p,const T2& vlaue) {
    new(p) T1(value); // placement new, invoke ctor of T1
}

首先了解placement new,可在指在内存地址构造一个对象的new函数。在C++里,new函数不能理解为与C的malloc相同,因为new还负责调用对象的构造函数,而malloc没有。

在了解placement new之后,再来解析这个代码:new(p) T1(value);
p是一个指向T1对象的指针,说明_construct的调用者已经为new准备好内存空间了,就是指针p。
T1(value)可理解为,以T2类型的对象实例value为参数来构造一个T1对象实例。
作为一个整体来理解,就是:_construct将在内存地址p,通过value构造一个类型为T1的对象实例。

------------------------------------
欢迎光临我的博客:www.danoking.com [DNK的生涯|IT人的故事]

论坛徽章:
0
4 [报告]
发表于 2012-05-06 12:03 |只看该作者
谢谢楼上的各位

这事我在网上搜到的资料:

C++ new 和Placement New 以及nothrow new


new有三种使用方式:plain new,nothrow new和placement new。

(1)plain new顾名思义就是普通的new,就是我们惯常使用的new。在C++中是这样定义的:

    void* operator new(std::size_t) throw(std::bad_alloc);

    void operator delete(void *) throw();

提示:plain new在分配失败的情况下,抛出异常std::bad_alloc而不是返回NULL,因此通过判断返回值是否为NULL是徒劳的。

(2)nothrow new是不抛出异常的运算符new的形式。nothrow new在失败时,返回NULL。定义如下:

    void * operator new(std::size_t,const std::nothrow_t&) throw();

    void operator delete(void*) throw();

(3)placement new意即“放置”,这种new允许在一块已经分配成功的内存上重新构造对象或对象数组。placement new不用担心内存分配失败,因为它根本不分配内存,它做的唯一一件事情就是调用对象的构造函数。定义如下:

    void* operator new(size_t,void*);

    void operator delete(void*,void*);

提示1:palcement new的主要用途就是反复使用一块较大的动态分配的内存来构造不同类型的对象或者他们的数组。

提示2:placement new构造起来的对象或其数组,要显示的调用他们的析构函数来销毁,千万不要使用delete。

char* p = new(nothrow) char[100];

long *q1 = new(p) long(100);

int *q2 = new(p) int[100/sizeof(int)];

char* p = new(nothrow) char[100];

long *q1 = new(p) long(100);

int *q2 = new(p) int[100/sizeof(int)];

这三句的意思是先用nothrow new申请char[100]空间,再在这片空间上申请一个long类型的空间存放100,然后是int型的数组

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP