C++ 继承和 valgrind 内存泄漏
C++ inheritance and valgrind memory leak
我正在用 valgrind 检查我的代码,它发现了内存泄漏。我不明白为什么会这样。我没有放置我的主要代码,而是编写了一个类似的程序来检查是我的其他分配(字符数组等)导致了问题还是 classes 导致了这个问题。
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;
}
代码中没有什么花哨的地方。有基数classes,我想在最后一个class中得到一个指针作为第一个基数class的指针。
当我编译这个 valgrind 时显示 4 allocs 3 frees。
这段代码有什么问题?也许我误解了继承的概念。然而,当我将 something 函数称为
something("blabla")
没有打印错误。
因为基 class 没有虚拟析构函数,所以在这个语句中
delete ex;
根据指针的静态类型只调用了classzoo
的析构函数。此语句中创建的 foo
类型对象的子对象
return (zoo *) new foo(1,2,str);
没有被破坏。
您至少可以在 class zoo
中定义析构函数,例如
class zoo{
public:
int x;
zoo(int a){x = a;};
virtual ~zoo() = default;
};
我正在用 valgrind 检查我的代码,它发现了内存泄漏。我不明白为什么会这样。我没有放置我的主要代码,而是编写了一个类似的程序来检查是我的其他分配(字符数组等)导致了问题还是 classes 导致了这个问题。
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;
}
代码中没有什么花哨的地方。有基数classes,我想在最后一个class中得到一个指针作为第一个基数class的指针。
当我编译这个 valgrind 时显示 4 allocs 3 frees。
这段代码有什么问题?也许我误解了继承的概念。然而,当我将 something 函数称为
something("blabla")
没有打印错误。
因为基 class 没有虚拟析构函数,所以在这个语句中
delete ex;
根据指针的静态类型只调用了classzoo
的析构函数。此语句中创建的 foo
类型对象的子对象
return (zoo *) new foo(1,2,str);
没有被破坏。
您至少可以在 class zoo
中定义析构函数,例如
class zoo{
public:
int x;
zoo(int a){x = a;};
virtual ~zoo() = default;
};