C ++继承和valgrind内存泄漏

时间:2020-03-11 20:22:54

标签: c++ inheritance valgrind destructor virtual-destructor

我正在用valgrind检查我的代码,发现内存泄漏。我不明白为什么会这样。我没有放置我的主要代码,而是制作了一个类似的程序来检查我的其他分配(char数组等)是否引起了该问题或类是否导致了此问题。

class zoo{
public:
    int x;
    zoo(int a){x = a;};
};

class doo:public zoo{
public:
    int y;
    doo(int a,int b):zoo(a){y = b;};
};

class foo : public doo{
public:
    String z;
    foo(int a, int b, const char *c):doo(a,b){
        z = c;
    };
};

zoo * something(const char * str){
    return (zoo *) new foo(1,2,str);
}
int main() {
    zoo * ex = something("blabla:sometext:blabla:overflow:message");
    cout<<"msg:"<< ((foo*)ex)->z<<endl;
    delete ex;
    return 0;
}

代码中没有花哨的东西。有基类,我想在最后一个类中获得一个指针作为第一个基类的指针。

当我编译该valgrind时,它显示4个分配3个空闲时间。

此代码有什么问题?也许我误解了继承的概念。但是当我将 something 函数称为

something("blabla")

没有打印错误。

1 个答案:

答案 0 :(得分:2)

因为基类中没有虚拟析构函数,所以在此语句中

delete ex;

根据指针的静态类型,仅调用类zoo的析构函数。在此语句中创建的foo类型的对象的子对象

return (zoo *) new foo(1,2,str);

没有被破坏。

您至少可以在类zoo中定义析构函数,如

class zoo{
public:
    int x;
    zoo(int a){x = a;};
    virtual ~zoo() = default;
};
相关问题