面试题答案
一键面试- 虚析构函数调用顺序:
- 当
main
函数中ptr
的生命周期结束时(main
函数返回,ptr
离开作用域),智能指针ptr
会自动释放其所管理的对象。 - 由于
ptr
指向的实际对象是Composite
类型(通过GetComposite
函数创建),首先调用Composite
的析构函数。输出:Composite destructor
。 - 因为
Composite
继承自Child
和OtherChild
,接下来会调用Child
和OtherChild
的析构函数。这里由于C++的多重继承特性,先调用Child
的析构函数,输出:Child destructor
,再调用OtherChild
的析构函数,输出:OtherChild destructor
。 Child
和OtherChild
又都继承自Parent
,所以会调用Parent
的析构函数,输出:Parent destructor
。Parent
继承自GrandParent
,最后调用GrandParent
的析构函数,输出:GrandParent destructor
。- 总的调用顺序为:
Composite destructor
->Child destructor
->OtherChild destructor
->Parent destructor
->GrandParent destructor
。
- 当
- 智能指针管理对其的影响:
- 使用
std::unique_ptr
管理对象,std::unique_ptr
负责对象的自动释放。当std::unique_ptr
离开其作用域(在main
函数返回时ptr
离开作用域),它会自动调用所管理对象的析构函数。 - 这种自动管理机制确保了对象资源(例如动态分配的内存等)的正确释放,避免了内存泄漏。同时,由于
std::unique_ptr
指向的是GrandParent
类型,通过虚析构函数机制,能够正确地调用到实际对象(Composite
)及其所有基类的析构函数,保证了整个对象层次结构的正确销毁。如果没有虚析构函数,当通过GrandParent
类型的指针(这里是std::unique_ptr<GrandParent>
)释放对象时,只会调用GrandParent
的析构函数,导致Composite
及其其他基类的析构函数不会被调用,从而可能引发内存泄漏和未定义行为。
- 使用
所以,智能指针std::unique_ptr
结合虚析构函数,保证了复杂继承体系下对象生命周期的正确管理和资源的安全释放。