linux下主动调用构造函数的问题,win32下正常。。。

linoom 2011-09-05 09:37:01
例如申请SCHeartBeat类对象大小的内存空间,然后主动调用SCHeartBeat的构造函数,
linux gcc版本4.4.3 报错为:错误地使用了‘SCHeartBeat’。。。
代码如下:
   1. SCHeartBeat* pMsg = (SCHeartBeat* )Tool::Singleton<MemPool>::Instance()
2. ->Alloc(sizeof(SCHeartBeat));
3. pMsg->SCHeartBeat::SCHeartBeat();



我把问题简单提取了下 如下:
   1. class Base
2. {
3. int base;
4.

5. public:
6. Base() { }
7. virtual ~Base() { }
8.

9. virtual void func() = 0;
10. };
11.

12. class Dervied : public Base
13. {
14. int der;
15.

16. public:
17. Dervied() { std::cout <<"Construct\n"; }
18. virtual ~Dervied() { std::cout <<"Destuct\n"; }
19.

20. virtual void fun() { der += 1; }
21. };
22.

23.


24.



25. int main()
26. {
27. Dervied* pD = (Dervied* )malloc(sizeof(Dervied));
28. pD->Dervied::Dervied();
29.

30. //pD->fun();
31.
32. }
...全文
208 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
vivare 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 linoom 的回复:]

引用 4 楼 taodm 的回复:

哦,楼主,听说过placement new没有?
要手工调用构造函数,只有声音placement new。
你那个语法,只是产生一个临时对象而已,这是基本功啊。


linux下不行,, 直接 SCHeartBeat* pMsg = new SCHeartBeat(); 肯定不错,
但现在是要在内存池分配的空间构造SCHeartBeat; 而……
[/Quote]

用placement new是对的。但是你的基类是抽象类肯定不能实例化啊
void* buf = malloc(sizeof(Dervied));
pD = new(buf) Dervied();
这样不行么
wonsea 2011-12-08
  • 打赏
  • 举报
回复
GCC不支持主动调用构造么;主动调用构造不晓得是不是标准c++的语法
RangersPerson 2011-09-06
  • 打赏
  • 举报
回复
mark
masterz 2011-09-06
  • 打赏
  • 举报
回复
you can override operator new/delete for your class
Roy_Smiling 2011-09-06
  • 打赏
  • 举报
回复
我是来打酱油的
taodm 2011-09-06
  • 打赏
  • 举报
回复
placement new你咋写的?报啥错?
[Quote=引用 5 楼 linoom 的回复:]
linux下不行,, 直接 SCHeartBeat* pMsg = new SCHeartBeat(); 肯定不错,
但现在是要在内存池分配的空间构造SCHeartBeat; 而p……
[/Quote]
linoom 2011-09-06
  • 打赏
  • 举报
回复
linux如何能解决这个问题??
liufang421 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 linoom 的回复:]
引用 8 楼 liufang421 的回复:

Dervied* pD = malloc(size)
Dervied* tpD = new Dervied
memcpy(pD, tpD)
delete tpD

然后自己写init和clear函数不要在构造和析构里面操作内存


之所以用内存池就是为了减少new带来的内存碎片,以及new delete的时间开销;
而这里仍然用……
[/Quote]
那你不new,用个全局的对象然后每次用这个对象去memset你分配的空间。
linoom 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liufang421 的回复:]

Dervied* pD = malloc(size)
Dervied* tpD = new Dervied
memcpy(pD, tpD)
delete tpD

然后自己写init和clear函数不要在构造和析构里面操作内存
[/Quote]

之所以用内存池就是为了减少new带来的内存碎片,以及new delete的时间开销;
而这里仍然用了new 然后再memcpy,违背了本初
liufang421 2011-09-06
  • 打赏
  • 举报
回复
Dervied* pD = malloc(size)
Dervied* tpD = new Dervied
memcpy(pD, tpD)
delete tpD

然后自己写init和clear函数不要在构造和析构里面操作内存
linoom 2011-09-05
  • 打赏
  • 举报
回复
由于服务器底层代码是夸平台的,采用的Windows下调试(select)而在linux下运营(epoll)
所以 现在问题是linux如何能解决这个问题
linoom 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 taodm 的回复:]

哦,楼主,听说过placement new没有?
要手工调用构造函数,只有声音placement new。
你那个语法,只是产生一个临时对象而已,这是基本功啊。
[/Quote]

linux下不行,, 直接 SCHeartBeat* pMsg = new SCHeartBeat(); 肯定不错,
但现在是要在内存池分配的空间构造SCHeartBeat; 而placement new 会因为基类有纯虚函数而报错,, 而我实际服务器代码class Packet中有不少纯虚函数。
在 win 7 4核下是可以的,而在win Server2008 16核下有时会出错,有时不出错,属于随机现象。
taodm 2011-09-05
  • 打赏
  • 举报
回复
哦,楼主,听说过placement new没有?
要手工调用构造函数,只有声音placement new。
你那个语法,只是产生一个临时对象而已,这是基本功啊。
linoom 2011-09-05
  • 打赏
  • 举报
回复
那是我写的内存池,分配固定大小的内存,,然后构造对象


malloc那个是我用及其简单的方式提出出来的,在 “我把问题简单提取了下” 以说明

我总不能把10多万行的服务器 C++代码发出来吧
luciferisnotsatan 2011-09-05
  • 打赏
  • 举报
回复
vs2005编译没问题。
但这么写有问题吧,含有虚函数,就有了个虚指针。自己怎么处理这个虚指针呢?
taodm 2011-09-05
  • 打赏
  • 举报
回复
楼主啊,你到底学过c++没有啊,构造类对象竟然用malloc。

65,187

社区成员

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

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