关于new

elevenj 2002-09-18 10:22:35
ml_HBC_Event* data = new (m_browserThreadContext)
ml_HBC_Event(keyAction->getSource());
其中m_browserThreadContext是ml_hb 类的一个成员变量,这是不是将new的ml_HBC_Event类转换成和m_browserThreadContext一样的
...全文
4 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
stidio_zhougang 2002-09-18
不是,new()这样的意思是指不重新分配内存空间,而是将需要的空间指定到括号内制定的区域,比如说:
int *p=new int;
int *pCopy=new(p) int;
现在你可以测试一下p和pCopy的具体指向。
回复
elevenj 2002-09-18
thanks
回复
alexxing 2002-09-18
具体到这个问题:

ml_HBC_Event* data = new (m_browserThreadContext) ml_HBC_Event(keyAction->getSource());

就是在变量 this->m_browserThreadContext 的内存空间里创建一个类 ml_HBC_Event 的对象,调用构造函数 ml_HBC_Event(arg),其中 arg = keyAction->getSource(),并将对象的地址(等于 m_browserThreadContext 的地址)赋值给 data
这个语句的成功有个前提:

sizeof(m_browserThreadContext) >= sizeof(ml_HBC_Event)

否则就会发生内存越界,导致运行错误
回复
alexxing 2002-09-18
不能说是强制转换,这是 new 的“定位”工作方式

通常的 new 都是在系统堆里分配一块内存空间,然后返回这块空间的首地址:

CLASS * ptr = new CLASS(arg);

在系统堆里分配一块大小为 sizeof(CLASS) 的内存空间,在这块空间上创建一个 CLASS 类的对象,并调用其构造函数,最后将成功创建的对象地址赋值给 ptr

而 new 的“定位”工作方式,则是在指定变量的地址空间里分配新空间,或者说把这块空间“另作它用”

CLASS * ptr = new (var) CLASS(arg);

在变量 var 的内存空间里分配一块大小为 sizeof(CLASS) 的内存空间,在这块空间上创建一个 CLASS 类的对象,并调用其构造函数,最后将成功创建的对象地址(等于 var 的地址)赋值给 ptr,这跟简单的“强制类型转换”是不同的
回复
liubear 2002-09-18
只是将data的指针强制转换为m_browserThreadContext类型

并不是将ml_HBC_Event类转换成和m_browserThreadContext一样的
回复
oyxiaoyu0 2002-09-18
对!
就是强制转化!
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告