虚析构函数的作用?

虚析构函数在C++中的主要作用是用于解决基类指针指向派生类对象,并且通过基类指针删除对象时可能导致的内存泄漏问题。

当使用基类指针指向派生类对象,然后尝试删除该对象时,如果基类的析构函数不是虚的,只会调用基类的析构函数,而不会调用派生类的析构函数。

这可能导致派生类对象中的资源没有得到正确释放,从而产生内存泄漏。

图片[1]-虚析构函数的作用?-不念博客

通过将基类的析构函数声明为虚函数,就能够在基类指针指向派生类对象时正确地调用派生类的析构函数,确保对象的资源得到正确释放。

给个例子:

#include <iostream>
class Base {
public:
Base() {
std::cout << "Base constructor" << std::endl;
}
virtual ~Base() {
std::cout << "Base destructor" << std::endl;
}
};
class Derived : public Base {
public:
Derived() {
std::cout << "Derived constructor" << std::endl;
}
~Derived() {
std::cout << "Derived destructor" << std::endl;
}
};
int main() {
Base* obj = new Derived();
delete obj; // 正确释放资源,输出Derived destructor,然后输出Base destructor
return 0;
}
#include <iostream>

class Base {
public:
    Base() {
        std::cout << "Base constructor" << std::endl;
    }

    virtual ~Base() {
        std::cout << "Base destructor" << std::endl;
    }
};

class Derived : public Base {
public:
    Derived() {
        std::cout << "Derived constructor" << std::endl;
    }

    ~Derived() {
        std::cout << "Derived destructor" << std::endl;
    }
};

int main() {
    Base* obj = new Derived();
    delete obj;  // 正确释放资源,输出Derived destructor,然后输出Base destructor

    return 0;
}
#include <iostream> class Base { public: Base() { std::cout << "Base constructor" << std::endl; } virtual ~Base() { std::cout << "Base destructor" << std::endl; } }; class Derived : public Base { public: Derived() { std::cout << "Derived constructor" << std::endl; } ~Derived() { std::cout << "Derived destructor" << std::endl; } }; int main() { Base* obj = new Derived(); delete obj; // 正确释放资源,输出Derived destructor,然后输出Base destructor return 0; }
© 版权声明
THE END