C++基类指针指向的派生类对象内存的释放

C++由于基类指针可以指向不同的派生类对象,因此当赋予基类指针不同的地址时,要注意之前的派生类对象的内存释放。

int main(){
	Parent* ptr = new Child1;
	Child2 myChild2;
	Child3 myChild3;

	ptr->show();
	delete ptr;			//位置1

	ptr = &myChild2;
	ptr->show();
	delete ptr;			//位置2

	ptr = &myChild3;
	ptr->show();
	delete ptr;			//位置3

	system("pause");
	return 0;
}

这段代码中,只有位置1处可以释放ptr指向的内存,位置2、位置3处是错误的。

因为只有刚开始时ptr指向的内存是动态分配的(new),创建在堆上,而myChild2,myChild3的内存是在栈上的,程序结束后会自动释放。位置1处释放内存之后,已经没有动态分配的内存,因此不能再使用delete ptr。除非在位置2之前使用ptr = new Child2;为Child2类动态分配一个内存,这时才需要释放。

并且位置1处delete ptr;也是必须的,因为如果此处不释放Child1对象内存,ptr=&myChild2;之后,将没有指针指向Child1的内存,发生内存泄露。

此外,delete ptr时,编译器只知道该指针的类型是“指向基类的指针”,不知道它实际指向的对象的类型。因此,如果基类不使用虚析构函数的话,编译器在delete ptr时,只能调用基类的析构函数,而不能调用派生类的析构函数,不能释放派生类可能分配的动态内存。

解决问题的方法就是:在程序执行时动态解析对析构函数的调用,通过在基类中使用虚析构函数,这样销毁所有动态分配的内存。

时间: 2024-11-16 03:27:43

C++基类指针指向的派生类对象内存的释放的相关文章

boost::serialization 用基类指针转存派生类(错误多多,一波三折)

boost::serialization 也支持c++的多态,这样我们就可以通过使用基类的指针来转存派生类, 我们接着上一篇( boost::serialization(2)序列化基类 )的例子来看: 基类和派生类的代码如下: class student_info { public: student_info() {} virtual ~student_info() {} student_info(const std::string& sn, const std::string& snm,

何使用派生类指针指向基类,即downcast向下转型?

基类指针指向派生类,我们已经很熟了.(视频下载) (全部书籍)假如我们想用派生类反过来指向基类,就需要有两个要求:1)马克-to-win:基类指针开始时指向派生类,2)我们还需要清清楚楚的转型一下. if you want to use derived class pointer point to base class, there are two requirements: 1) base class pointer is initially the type of the derived c

c++ 动态判断基类指针指向的子类类型(typeid)

我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢? 本文提供了两种方法 (1) 自定义类id, (2)typeid 一.自定义id 如下所示基类father有两个子类son1 和 son2,我们在基类中定义类虚函数id,子类中分别重载了该函数,各个子类返回值都不同 1 class father 2 { 3 public: 4 virtual void fun() 5 {

C++_派生类的构造函数及派生类和基类之间的特殊关系

派生类和基类的概念及派生类构造函数的原理: 创建一个叫做TableTennisPlayer的基类,记录会员的名字和是否有球桌. 1 //声明一个基类 2 class TableTennisPlayer 3 { 4 private: 5 string firstname; 6 string lastname; 7 bool hasTable; 8 9 public: 10 TableTennisPlayer(); 11 void Name() const; 12 bool HasTable() c

OC3-父类指针指向子类对象

// // Cat.h // OC3-父类指针指向子类对象 // // Created by qianfeng on 15/6/17. // Copyright (c) 2015年 qianfeng. All rights reserved. // #import "Animal.h" @interface Cat : Animal { float _height; } @property (assign,nonatomic)float height; @end // // Cat.m

【C++】通过基类的指针变量访问派生类中由基类继承来的隐藏对象

//<img src="http://img.blog.csdn.net/20150512213309005?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG91ZG91d2ExMjM0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> // 可以将一个派生类的对象的地址赋给其基类的指针变量,但

C++ typeid动态判断基类指针指向的子类类型

typeid是c++的关键字,typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件typeinfo中定义) ISO C++标准并没有确切定义type_info,它的确切定义编译器相关的,但是标准却规定了其实现必需提供如下四种操作: type_info类提供了public虚 析构函数,以使用户能够用其作为基类.它的默认构造函数和拷贝构造函数及赋值操作符都定义为private,所以不能定义或复制type_info类型的对象. 程序中创建type_info对象的唯一方

简单工厂类,有继承、虚函数重写、基类指针指向子类对象会发生多态(1)

class Fruit { public: virtual void get_fruit() { std::cout<<"Fruit:getFruit"<<std::endl; } }; class Pear : public Fruit { public: virtual void get_fruit() { std::cout<<"Pear:getFruit"<<std::endl; } }; class Bana

面向对象--多继承&amp;派生类对象内存布局分析&amp;各基类指针所指向的位置分析

背景 原文链接:ordeder  http://blog.csdn.net/ordeder/article/details/25477363 关于非虚函数的成员函数的调用机制,可以参考: http://blog.csdn.net/yuanyirui/article/details/4594805 成员函数的调用涉及到面向对象语言的反射机制. 虚函数表机制可以查看下面这个blog: http://blog.csdn.net/haoel/article/details/1948051 总结为: 其一