64,648
社区成员
发帖
与我相关
我的任务
分享
嗯,3q,有点明白了。但是我搞不懂的一点是,即使是内存泄露,怎么会造成运行时崩溃呢? [quote=引用 10 楼 lcmzgy 的回复:] 派生类有虚函数,使用了动态联编,会在类里面多出一个vptr指针来指向虚函数表,以及多出来的一张虚函数表。delete p只是调用基类的析构函数,很明显没有释放派生类里面多出来的内容,造成内存泄露。 这边你可以声明一个虚拟的析构函数,也可以将基类中的fun函数也声明为虚拟的,这样的话,基类中就会也有vptr,和虚函数表,派生类只是继承这些内容。因此在基类的析构就足以将需要释放的资源释放了
嗯,3q,有点明白了。但是我搞不懂的一点是,即使是内存泄露,怎么会造成运行时崩溃呢? [quote=引用 12 楼 pxhero2012 的回复:] [quote=引用 10 楼 lcmzgy 的回复:] 派生类有虚函数,使用了动态联编,会在类里面多出一个vptr指针来指向虚函数表,以及多出来的一张虚函数表。delete p只是调用基类的析构函数,很明显没有释放派生类里面多出来的内容,造成内存泄露。 这边你可以声明一个虚拟的析构函数,也可以将基类中的fun函数也声明为虚拟的,这样的话,基类中就会也有vptr,和虚函数表,派生类只是继承这些内容。因此在基类的析构就足以将需要释放的资源释放了
关于内存泄露前面已经解释得很清楚了。 我在mac osx上测试,运行打印结果正常。 确实不解为何你会执行失败。
[quote=引用 7 楼 pxhero2012 的回复:] [quote=引用 5 楼 unituniverse2 的回复:] 看这个吧。 http://blog.csdn.net/unituniverse2/article/details/12302139
派生类有虚函数,使用了动态联编,会在类里面多出一个vptr指针来指向虚函数表,以及多出来的一张虚函数表。delete p只是调用基类的析构函数,很明显没有释放派生类里面多出来的内容,造成内存泄露。 这边你可以声明一个虚拟的析构函数,也可以将基类中的fun函数也声明为虚拟的,这样的话,基类中就会也有vptr,和虚函数表,派生类只是继承这些内容。因此在基类的析构就足以将需要释放的资源释放了
[quote=引用 5 楼 unituniverse2 的回复:] 看这个吧。 http://blog.csdn.net/unituniverse2/article/details/12302139
核心问题是楼主的基类的fun函数并不是虚函数,子类的fun与父类的fun不能进行动态认定。 在主函数中,使用基类指针持有子类对象,在调用fun时,由于fun并不是虚函数,所以只能调用基类fun。 问题出现了,实例化的对象实际是子类,子类对象结构与基类并不一致,此时调用fun函数就成了未定义场景,可能有对象截断:比如截个基类对象出来再调用fun 可能越界访问:比如直接拿着这个对象去访问并基类对象无法控制的区域 或是其他做法 不过在我的cfree5.0上,你这段代码变现还算正常,直接调用了基类fun函数。
看这个吧。 http://blog.csdn.net/unituniverse2/article/details/12302139
嗯,3q,有点明白了。但是我搞不懂的一点是,即使是内存泄露,怎么会造成运行时崩溃呢? [quote=引用 12 楼 pxhero2012 的回复:] [quote=引用 10 楼 lcmzgy 的回复:] 派生类有虚函数,使用了动态联编,会在类里面多出一个vptr指针来指向虚函数表,以及多出来的一张虚函数表。delete p只是调用基类的析构函数,很明显没有释放派生类里面多出来的内容,造成内存泄露。 这边你可以声明一个虚拟的析构函数,也可以将基类中的fun函数也声明为虚拟的,这样的话,基类中就会也有vptr,和虚函数表,派生类只是继承这些内容。因此在基类的析构就足以将需要释放的资源释放了
也就是说当我们利用基类指针去释放子类的空间时,如果基类的析构函数不为虚函数,则释放空间时就不会调用子类的析构函数。这时,假如我们在子类的析构函数中存在释放内存的操作,由于不会调用子类的析构函数,因此那块内存也得不到释放,最终造成内存泄露。