C++析构函数-继承上下文中的显式调用
C++ Destructor - Explicit calls in an Inheritance context
我不确定我的问题有多中肯,但问题到此为止。
我知道,只有当我们在堆上分配内存时,我们才应该显式调用析构函数。
假设我们有两个类:Animal和Dog,这是Animal的一个子类。
Animal a* = new Dog();
//-------Do something here-----//
a -> ~Animal();
再次假设Animal包含几个动态分配的字段,Dog类添加了几个动态分配字段。
因为Dog有更多的字段,所以调用Animal析构函数会导致内存泄漏。这只是糟糕的编程风格,还是我们可以找到一个变通方法?
我想我们需要将指针强制转换为Dog类型,然后调用析构函数,但我找不到任何关于如何正确执行此操作的参考。
因为Dog有更多的字段,所以调用Animal析构函数会导致内存泄漏。
如果Animal
的析构函数是virtual
,则不会发生这种情况。
此外,您不需要调用~Animal()
。一个例外是,如果您正在编写自己的分配器。通常您会调用delete a
。
我知道,只有当我们在堆上分配内存时,我们才应该显式调用析构函数。
不,不,不。除非在非常特殊的情况下,否则你永远不会显式地调用析构函数(据我所知,placement-new和union是两个)。
这里需要做的是在指针上调用delete
。正如rlbond已经说过的,只要基类的析构函数是虚拟的,通过基指针删除就可以了。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 我的一些 D3D11 对象在调用某些设备上下文函数时将自身作为 ComPtrs 为空
- E/libEGL:调用没有当前上下文的 OpenGL ES API (每个线程记录一次) - Android/SDL
- 在调用运算符重载时识别调用上下文/用法C++
- 如何将有关最顶层调用/上下文的信息添加到异常
- 如何修复C#应用程序中调用C++DLL函数时的上下文加载错误
- 删除程序的调用上下文
- 为什么从 DLL 调用 boost::wave::上下文构造函数时会死锁
- 使用后期绑定从非私有上下文调用私有方法
- 提升 asio ssl:如果私钥传递上下文::use_private_key,则不调用密码回调
- C++类方法,可以使用虚拟调度或类似于没有对象上下文的静态函数来调用
- QTableWidget-QMenu上下文菜单-AddAction插槽不调用函数
- 根据调用方/上下文专门化函数的行为
- 从QQuickWidget上下文调用QML方法
- MFC:从不同的类调用上下文菜单单击的函数,而不是让它调用其默认函数
- 模板函数具有调用方的上下文?
- std::condition_variable::notify_one()在没有上下文切换的情况下调用了多次