类C1继承C0,C1所需空间大于C0;C1 *p=new C1; delete (C0*)p是不是不会完全释放new申请的内存?望大虾们指点!

时间:2021-04-25 03:40:20
如题;
类C1继承C0,C1所需空间大于C0;C1 *p=new C1; delete (C0*)p是不是不会完全释放new申请的内存?
望大虾们指点!

5 个解决方案

#1


C0的析构函数是虚函数的话就会正确析构

#2


语法上会泄漏,但最终还要看编译器的

#3


类C1继承C0,C1所需空间大于C0;C1 *p=new C1; delete (C0*)p是不是不会完全释放new申请的内存?望大虾们指点!用_crtdebug
会报错么、?

#4


引用 1 楼 akirya 的回复:
C0的析构函数是虚函数的话就会正确析构


有道理

#5


内存块分配是另外一套机制,按照地址和大小记录的,和类无关,按照不同的类delete,对象“本身”所占的内存块也一定会完全释放的。

会出问题的是,类的成员,比如有CString成员,没有调用正确的析构函数的话,CString里面分配的内存就无法释放,或者按照错误的方式析构成员会引起异常。

针对你的情况,把析构函数定义成虚函数就行了。

#1


C0的析构函数是虚函数的话就会正确析构

#2


语法上会泄漏,但最终还要看编译器的

#3


类C1继承C0,C1所需空间大于C0;C1 *p=new C1; delete (C0*)p是不是不会完全释放new申请的内存?望大虾们指点!用_crtdebug
会报错么、?

#4


引用 1 楼 akirya 的回复:
C0的析构函数是虚函数的话就会正确析构


有道理

#5


内存块分配是另外一套机制,按照地址和大小记录的,和类无关,按照不同的类delete,对象“本身”所占的内存块也一定会完全释放的。

会出问题的是,类的成员,比如有CString成员,没有调用正确的析构函数的话,CString里面分配的内存就无法释放,或者按照错误的方式析构成员会引起异常。

针对你的情况,把析构函数定义成虚函数就行了。