关于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一样的
...全文
44 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
对!
就是强制转化!

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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