zoukankan      html  css  js  c++  java
  • 虚析构函数

    在C++中,析构函数最好定义为虚函数,在类成员中有需要程序员自己申请和释放的成员,比如说指针类型的成员时,当用父类指针指向子类,虚析构函数能够使父类的指针正确地调用属于子类的析构函数,下面是一个例子:

    #include <iostream>
    
    using namespace std;
    
     
    
    class A
    
    {
    
    public:
    
            A()
    
            {
    
                    std::cout << "A is created." << std::endl;
    
            }
    
     
    
            ~A()
    
            {
    
                    std::cout << "A is deleted." << std::endl;
    
            }
    
    };
    
     
    
    class B : public A
    
    {
    
    public:
    
            B()
    
            {
    
                    std::cout << "B is created." << std::endl;
    
            }
    
     
    
            ~B()
    
            {
    
                    std::cout << "B is deleted." << std::endl;
    
            }
    
    };
    
     
    
    int main(int argc, char** argv)
    
    {
    
            A* pA = new B();
    
            delete pA;
    
     
    
            return 0;
    
    }

    image

    可以看到delete pA调用的是A类的析构函数,B类中没有创建一些特殊的资源,如文件句柄,内存空间之类,所以这么delete没问题,但是如果申请了的话,这样会造成内存泄露。正确的写法应该是这样的:

    #include <iostream>
    
    using namespace std;
    
     
    
    class A
    
    {
    
    public:
    
            A()
    
            {
    
                    std::cout << "A is created." << std::endl;
    
            }
    
     
    
            virtual ~A()
    
            {
    
                    std::cout << "A is deleted." << std::endl;
    
            }
    
    };
    
     
    
    class B : public A
    
    {
    
    public:
    
            B()
    
            {
    
                    std::cout << "B is created." << std::endl;
    
            }
    
     
    
            ~B()
    
            {
    
                    std::cout << "B is deleted." << std::endl;
    
            }
    
    };
    
     
    
    int main(int argc, char** argv)
    
    {
    
            A* pA = new B();
    
            delete pA;
    
     
    
            return 0;
    
    }

    image

    可以看到,确定为基类的类的析构函数设为虚函数之后可以避免这一问题

  • 相关阅读:
    SQL语句常见优化方法
    MySql索引
    Zookeeper学习记录(一):设计与实现
    linux下修改防火墙端口对外开放方法
    Kafka的Producer以及Consumer远程调用问题
    kafka与Spring的集成
    Kafka在Linux环境下搭建过程
    kafka-分布式消息系统
    打字母的游戏&Java入门
    SVN流程图协作图
  • 原文地址:https://www.cnblogs.com/obama/p/3038883.html
Copyright © 2011-2022 走看看