【241007】C++——基类不使用虚析构函数,会发生什么?

127 阅读1分钟

如果基类没有定义虚析构函数,而你通过基类指针或引用删除派生类对象,可能会导致未定义行为。这是因为当一个对象被删除时,只有基类的析构函数会被调用,而派生类的析构函数不会被调用,导致派生类中资源无法正确释放,如动态分配的内存或其他资源泄漏。

具体来说

  1. 派生类的析构函数不会调用:如果基类的析构函数不是虚函数,那么当通过基类指针删除一个派生类对象时,只会调用基类的析构函数,派生类的析构函数不会被调用。这会导致派生类中分配的资源(例如动态分配的内存)得不到正确释放,可能造成资源泄漏。
  2. 资源管理问题:派生类中负责管理的资源,比如文件句柄、内存等,可能不会被正确地释放,因为派生类的析构函数无法执行清理工作。

因此,在设计基类时,如果有可能通过基类指针或引用删除派生类对象,应该将基类的析构函数声明为虚函数。这样,删除派生类对象时,派生类的析构函数会被正确调用,确保所有资源得到正确释放。