C++基类指针指向的派生类对象内存的释放
2015-05-27 16:43
579 查看
C++由于基类指针可以指向不同的派生类对象,因此当赋予基类指针不同的地址时,要注意之前的派生类对象的内存释放。
因为只有刚开始时ptr指向的内存是动态分配的(new),创建在堆上,而myChild2,myChild3的内存是在栈上的,程序结束后会自动释放。位置1处释放内存之后,已经没有动态分配的内存,因此不能再使用delete ptr。除非在位置2之前使用ptr = new Child2;为Child2类动态分配一个内存,这时才需要释放。
并且位置1处delete ptr;也是必须的,因为如果此处不释放Child1对象内存,ptr=&myChild2;之后,将没有指针指向Child1的内存,发生内存泄露。
此外,delete ptr时,编译器只知道该指针的类型是“指向基类的指针”,不知道它实际指向的对象的类型。因此,如果基类不使用虚析构函数的话,编译器在delete ptr时,只能调用基类的析构函数,而不能调用派生类的析构函数,不能释放派生类可能分配的动态内存。
解决问题的方法就是:在程序执行时动态解析对析构函数的调用,通过在基类中使用虚析构函数,这样销毁所有动态分配的内存。
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时,只能调用基类的析构函数,而不能调用派生类的析构函数,不能释放派生类可能分配的动态内存。
解决问题的方法就是:在程序执行时动态解析对析构函数的调用,通过在基类中使用虚析构函数,这样销毁所有动态分配的内存。
相关文章推荐
- C++ 派生类指针强制指向基类对象
- C++ 派生类指针强制指向基类对象
- C++ 基类指针指向派生对象/派生类指针指向基类对象
- 【C++】基类指针可以指向派生类对象,派生类指针不可以指向基类对象
- C++ 派生类指针指向基类对象
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析(解决面试宝典第四版P147问题)
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析
- C++ 基类指针指向派生类对象
- C++中,基类的指针指向派生类的对象
- 为什么基类指针和引用可以指向派生类对象,但是反过来不行?
- [C/C++][经典探讨]类继承中,通过基类指针delete释放,是否会造成内存泄漏
- 基类指针指向派生类对象
- C++ 基类、派生类对象指针的声明与使用
- C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- 关于c++在内存布局意义下使用派生类指针访问基类
- 基类指针指向派生类对象
- 解释为什么基类的析构函数不为虚的话,基类指针指向子类对象,删除对象时,派生类的析构函数就不会被调用
- 为什么要用基类指针指向派生类对象?
- 为什么基类指针可以指向派生类对象,而派生类则不可以指向基类