c++ - 删除多态对象和内存泄漏

标签 c++ polymorphism

假设我有一个类 A 和一个继承自 A 的类 B。 然后我做类似的事情:

A* a = new B();
delete a;

为什么只有在B内部有动态内存分配时才会发生内存泄漏? 当 B 中存在动态内存分配但失败时,C++ 如何知道删除“B 部分”?

[更新:]

以下代码如何不会导致内存泄漏:[我怀疑它是未定义的行为,但我真的不明白任何事:(]

#include <iostream>
using std::cout;
using std::endl;


class A {
public:
    virtual void f() {
        cout << "1" << endl;
    }
    ~A() {
        cout<< "A A'tor" << endl;
    }
};

class B : public A {
private:

public:
    B(){}
    ~B(){
        cout<< "B D'tor" << endl;
    }
    void f() {
        cout << "2" << endl;
    }

};

int main() {
    A* a = new B();
    //a->f();
    delete a;
    return 0;
}

最佳答案

当编译器看到语句“delete a;”时
如果类 A 中没有虚析构函数,它只知道“a”的静态类型是指向 A 的指针。结果调用了错误的析构函数,导致内存泄漏

如果A类有虚析构函数 然后编译器知道“a”的动态类型是指向 B 的指针,并且会有一个 vtable,它将在运行时从那里获取 B 的析构函数地址

关于c++ - 删除多态对象和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26204843/

相关文章:

c++ - 使用像 std::string 这样有趣的类型来保存一些标记类型

c++ - 从 Qt 应用程序运行命令行点程序不会产生任何输出,这是怎么回事?

c++ - LeetCode #617 "Merge Two Binary Trees"使用 C++

c++ - 基类和派生类构造函数多态性问题

hibernate - 具有具体类特定属性条件的多态 HQL 查询;可以做到吗?

vba - 有没有办法为 VBA 中的一组类设置一组通用属性?

c++ - std::transform() 和 toupper(),没有匹配的函数

c++ - 有什么比使用静态整数更好的存储信息的方法? C++

java - Decorator模式链式方法如何调用?

c++ - 使用智能指针制作多态容器的正确方法是什么?