c++父类指针指向子类对象,如何释放干净子类对象的?

dawnButterfly 2020-05-19 09:53:56
小白刚刚开始学c++,求助一下:把问题的再具体一点就是:指针是依靠什么来判断我应该释放多大的空间的?
class A {
int a = 20;
};
class B :public A {
int b = 30;
};
int main()
{
cout << "------------------" << endl;
for (int i = 0; i <= 10000; ++i) {
B *pr = new B;
A *pt = pr;//使用一个父类的指针指向子类对象!
cout << "对象b的空间大小" << sizeof(*pr) << endl;
cout << "指针所指向的可访问空间大小:" << sizeof(*pt) << endl;//父类指针管理的空间只有4,也就是类A的a变量属性
delete pt;//使用父类的指针释放,是否会造成内存泄露?
}
return 0;
}

//pt指针是否能把子对象释放干净?指针释放的机制是什么?
...全文
834 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
写个析构函数,在析构函数中输出一个信息你就知道了
真相重于对错 2020-05-20
  • 打赏
  • 举报
回复 2
只要是堆上new 或者 malloc出来的指针,释放它时系统自然知道它的大小。这个不用程序员操心。 写析构函数的原因是,如果这个类内部有个指针,比如 class T{ char* str }; T t1; 那么在你delete t1时,他不会自动释放str;需要在析构函数中释放。而delete 其实是两步,1,调用析构函数,2释放t1的内存。 再说析构函数 如果一个类A ,再写一个类B继承于A 在B的析构函数中,他会自动调用A的析构函数。这个是C++编译器自动添加的。 回到你的问题,如果A的指针,指向一个B的对象则,当你delete 这个指针时,他不会调用B的析构函数,所以要把A的析构函数设定为virtual. 因为他是virtual的所以函数虚表析构函数的指向实际B的析构函数,当你delete 时候,会自动调用B的析构函数,而在B析构函数中编译器会自动加一条,A::~A(),进而删除了A的资源。
真相重于对错 2020-05-20
  • 打赏
  • 举报
回复
A加一个virtual 析构函数,b加一个析构函数

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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