`
badboywang
  • 浏览: 64713 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

把类的析构函数写成虚函数的用意

    博客分类:
  • vc++
 
阅读更多
#include <iostream.h>
class Base 
{ 
public: 
Base() { mPtr = new int; } 
~Base() { delete mPtr; cout<<"Base::Destruction"<<endl;} 
private: 
  int* mPtr; 
} ;

class Derived : public Base 
{ 
public: 
  Derived() { mDerived = new long; } 
  ~Derived() { delete mDerived; cout<<"Derived::Destruction"<<endl;} 
private: 
  long* mDerived; 
} ;

void main() 
{ 
  Base* p = new Derived; 
  delete p; 
} 

 

输出结果只有:Base::Destruction
以上代码会产生内存泄露,因为new出来的是Derived类资源,采用一个基类的指针来接收,析构的时候,编译器因为只是知道这个指针是基类的,所以只将基类部分的内存析构了,而不会析构子类的,就造成了内存泄露,如果将基类的析构函数改成虚函数,就可以避免这种情况,因为虚函数是后绑定,其实就是在虚函数列表中,析构函数将基类的析构函数用实际对象的一组析构函数替换掉了,也就是先执行子类的虚函数再执行父类的虚函数,这样子类的内存析构了,父类的内存也释放了,就不会产生内存泄露。
注:
1.析构函数其实是一个函数,不论子类还是父类,虽然可能看起来名字不一样。而且析构函数执行过程都是执行子类再到父类。
2.多态的时候一定要将析构函数写成虚函数,防止内存泄露,各个子类维护自己内部数据释放。

virtual 是实现多态的基础
它使得具体的函数跳转从编译时推迟到运行时然而构造函数的调用是编译器期间就决定的,因此它不能为虚
分享到:
评论
1 楼 IceWee 2010-08-05  
谢谢,明白了一点点,初学者我是。

相关推荐

    C++中析构函数定义成虚函数的原因.doc

    ### C++中析构函数定义成虚函数的原因 在C++编程中,为了实现多态性,虚函数机制被广泛采用。然而,在某些特定场景下,尤其是涉及到派生类和基类之间的对象管理时,将析构函数声明为虚函数显得尤为重要。本文将深入...

    虚析构函数示例

    在继承体系中,如果没有声明析构函数为虚的,那么通过基类指针或引用删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数,这可能会导致资源泄露和其他未定义行为。而声明了虚析构函数后,系统会...

    C++中虚析构函数的作用

    C++中虚析构函数的作用是为了确保当使用基类的指针删除派生类的对象时,派生类的析构函数被正确调用。这种机制可以防止内存泄漏和其他潜在的问题。 在C++中,析构函数是用来释放对象占用的资源的。通常情况下,析构...

    构造函数不能声明为虚函数,析构函数可以声明为虚函数

    反之,由于`A`的析构函数是虚函数,因此在删除`B`对象时,不仅调用了基类`A`的析构函数,还调用了派生类`B`的析构函数,从而正确释放了所有资源。 ### 总结 构造函数和析构函数在C++中扮演着至关重要的角色。构造...

    C++箴言:避免析构函数调用虚函数

    2. **成员变量未被正确释放**:由于析构函数遵循从派生类到基类的顺序,如果在基类析构函数中调用了虚函数,那么该函数可能会试图访问已经释放的派生类成员变量,从而导致未定义行为。 3. **潜在的内存泄漏**:如果...

    为何要虚析构函数.docx

    对于虚析构函数来说,虚函数表的存在使得可以根据实际对象的类型来决定调用哪个析构函数,从而实现了在对象销毁时的逆序操作:先调用派生类的析构函数,然后调用基类的析构函数,以保证派生类中新增的资源也能被正确...

    虚基类 虚函数成员 虚析构函数

    在销毁对象时,如果对象是通过基类指针或引用删除的,而对象实际上是派生类的实例,那么非虚析构函数只会调用基类的析构函数,派生类的析构函数不会被调用,可能会导致内存泄漏或资源未释放的问题。虚析构函数则能...

    构造函数与析构函数

    析构函数也是以类名作为函数名,与构造函数不同的是在函数名前添加一个“~”符号,标识该函数是析构函数。析构函数没有返回值,甚至void类型也不可以,析构函数也没有参数,因此析构函数是不能够重载的。这是析构...

    C#析构函数

    3. 析构函数的限制:C#中,一个类只能定义一个析构函数,而且析构函数不能被继承或重载,也不能被显式调用。析构函数中不能有参数和访问修饰符。 4. 析构函数与Finalize方法的关系:析构函数在内部被.NET运行时转换...

    C++中基类的析构函数为什么要用virtual虚析构函数.pdf

    virtual 虚析构函数可以确保基类指针指向派生类对象时,delete 操作符能够调用派生类的析构函数,从而释放内存空间。 因此,在 C++ 中,基类的析构函数应该使用 virtual 虚析构函数,以防止内存泄漏。

    c语言析构函数

    3. **唯一性**:一个类只能有一个析构函数,这是因为析构函数的调用是由C++运行时系统自动管理的,当对象生命周期结束时(如离开作用域或显式删除动态分配的对象),析构函数将被自动调用。 4. **自动调用**:析构...

    派生的析构函数被调用

    基类的析构函数默认是虚函数(virtual),这样在派生类的对象指针指向基类时,如果通过指针调用析构函数,会执行相应的派生类析构函数,确保所有资源都能被正确释放。这是因为C++支持动态绑定或称为运行时多态。 ...

    深析C++析构函数

    5. **可以是虚函数:** 如果类中包含虚函数,则析构函数也应声明为虚函数,以确保派生类的析构函数也能被正确调用。 #### 二、析构函数与资源管理 **资源管理的重要性:** 资源管理是程序设计中极其重要的环节之一...

    C++ 析构函数 参考源代码

    在有继承层次结构的类中,基类的析构函数通常是虚函数(`virtual`),以确保即使通过基类指针或引用删除派生类对象时,也能调用正确的析构函数。例如: ```cpp class Base { public: virtual ~Base() { // 基类析...

    C++析构函数使用virtual的原因

    若基类的析构函数不是虚的,当使用指向基类的指针删除派生类对象时,仅会调用基类的析构函数,而忽略派生类的析构函数。这可能导致派生类中动态分配的资源未被释放,引发内存泄漏。 2. **资源管理** 类型拥有指针...

    析构函数应用

    6. **可以是虚函数**:如果希望在派生类中覆盖基类的析构函数,则可以在基类中声明析构函数为虚函数。 #### 三、示例代码解析 下面通过给出的代码示例来详细了解析构函数的应用: ```cpp #include using ...

    delphi析构函数的使用

    在Delphi编程中,析构函数(Destructor)是对象生命周期中的一个重要组成部分,它与构造函数(Constructor)一起确保了对象的正确初始化和销毁。析构函数主要用于清理对象在使用过程中分配的资源,如动态内存、文件...

    析构函数不能抛出异常的原因

    ### 析构函数不能抛出异常的原因 在C++编程语言中,析构函数是一种特殊类型的成员函数,它主要用于在对象生命周期结束时执行清理工作,例如释放动态分配的内存资源等。由于析构函数的特殊性,C++标准明确规定:析构...

    C++析构函数 快速学习

    不声明为虚析构函数可能导致只调用了基类的析构函数,而忽略了派生类的析构函数,这是一种常见的错误。 此外,析构函数可以重载,就像普通成员函数一样。但要注意,析构函数的重载并不意味着它们会自动被调用,你...

    全面解读C#编程中的析构函数用法

    析构函数用于析构类的实例。 备注 不能在结构中定义析构函数。只能对类使用析构函数。 一个类只能有一个析构函数。 无法继承或重载析构函数。 无法调用析构函数。它们是被自动调用的。 析构函数既没有修饰符,也没有...

Global site tag (gtag.js) - Google Analytics