关于malloc和new的问题?

fancy_zhh 2003-09-29 10:14:28
关于malloc和new的问题?

class A {
int i;
public:
virtual void f()=0;
};
class B {
int j;
public:
void f(){MessageBox("aaaa")};
};
我如下用:
B * b = (B *)malloc(sizeof(B));
b->f(); //它为什么不能执行虚函数机制,显示出"aaaa",而是弹出一个错误
...全文
37 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
TopCat 2003-10-08
  • 打赏
  • 举报
回复
上面的伪代码还是有点问题,因为所有的B的实例是共享一份虚表,而不是每次malloc一个出来(这里应该可以用一个静态变量和引用计数实现),不过大概意思就是这样了,在用new产生实例的里会初始化虚表,而malloc的就不会
TopCat 2003-10-08
  • 打赏
  • 举报
回复
//class B的构造函数的伪代码
B:B()
{
_vptr = (_vtbl)malloc(sizeof(_vtbl) * numOfVirtualFunction)
_vptr[0] = f;
}

而对虚函数的调用b->f();
相当于:b->_vptr[0];

你用malloc处理,它没有初始化虚表指针_vptr,b->_vptr[0]的调用自然失败,也就是出错了。
ambition2005 2003-10-08
  • 打赏
  • 举报
回复
class A{
int i;
public:
void f()(MessageBox("aaa");)
};
void (*ff)();
A * a=new A();
ff = a+sizeof(int); //offset
ff();//
delete a;
类A还是没有构造函数呀!
ff = a+sizeof(int);
ff是函数指针,而a是类指针,怎么可以?

怎么样在new的空间大小中写入该类的一个成员函数(虚函数)地址的指针?
这句话是什么意思?
fancy_zhh 2003-10-08
  • 打赏
  • 举报
回复
up
zxm521b 2003-09-29
  • 打赏
  • 举报
回复
某些构造函数的调用不是必须的,但恰恰你这个就不行.
所以你这种情况下只能调用普通成员函数,至于为什么自己先琢磨
lth_81 2003-09-29
  • 打赏
  • 举报
回复
第一,你的类声明有问题,是不是应该是class B:public A呢???没有继承怎么体现虚拟堕胎?

第二,new和malloc的本质区别应该是new除了分配存储空间外,还会调用对象的构造函数,malloc应该不会
aflyinghorse 2003-09-29
  • 打赏
  • 举报
回复
class B {
int j;
public:
B(int a){j = a;}
void f(){MessageBox("aaaa")};
};
hongfeeling 2003-09-29
  • 打赏
  • 举报
回复
哦。我也想知道。
fancy_zhh 2003-09-29
  • 打赏
  • 举报
回复
以上两位的意思我知道
但是我想知道的是构造函数里到底做了些什么事

如果这个构造函数让你自已写,该如何处理?
就以上面这个例子为例
aflyinghorse 2003-09-29
  • 打赏
  • 举报
回复
malloc只是分配内存空间,并没有调用构造函数建立对象
所以对象b不存在。怎么能调用它的成员函数呢
而new则先分配空间,再调用构造函数建立对象,所以
c++中最好都用new来创建对象
csdn5211 2003-09-29
  • 打赏
  • 举报
回复
B * b = (B *)malloc(sizeof(B));只是申请了一个B那么大的内存,并没有创建B型的对象,没有调用构造函数。另外如果是想实现虚拟机制,应该是A* b=new B;b->f();才对。
BinaryWorld 2003-09-29
  • 打赏
  • 举报
回复
fancy_zhh(中华英雄)

以上两位的意思我知道
但是我想知道的是构造函数里到底做了些什么事

如果这个构造函数让你自已写,该如何处理?
就以上面这个例子为例


关注。。。。。。。。。。。
fancy_zhh 2003-09-29
  • 打赏
  • 举报
回复
应该是 class B:public A我写错了

《深度探索C++ 对象模型》我看过,但还是不能理解构造函数是怎么工作的.
或者有谁能帖一段代码出来看看!!!

我这里是想让大家亲自写一个构造函数,该如何写?
怎么样在new的空间大小中写入该类的一个成员函数(虚函数)地址的指针?

再者如果是另一种情况(不是虚机制):
class A{
int i;
public:
void f()(MessageBox("aaa");)
};
void (*ff)();
A * a=new A();
ff = a+sizeof(int); //offset
ff();//
delete a;

以上代码可能不能正常运行,我的意思是让函数指针ff指向A::f()
不知道具体该如何写?
请各位高手示下




Clerk_9919 2003-09-29
  • 打赏
  • 举报
回复
《深度探索C++ 对象模型》也许是你想看的书
cnxiaohai 2003-09-29
  • 打赏
  • 举报
回复
第一,你的类声明有问题,是不是应该是class B:public A呢???没有继承怎么体现虚拟堕胎?

第二,new和malloc的本质区别应该是new除了分配存储空间外,还会调用对象的构造函数,malloc应该不会

某些构造函数的调用不是必须的,但恰恰你这个就不行.

所以你这种情况下只能调用普通成员函数,至于为什么自己先琢磨
skywinner 2003-09-29
  • 打赏
  • 举报
回复
vptr指针没有初始化
simclock 2003-09-29
  • 打赏
  • 举报
回复
对,你用new吧,这才初始化一个对象

69,364

社区成员

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

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