gpt4 book ai didi

c++ - 这是删除基类指针的内存泄漏吗,如何改正

转载 作者:行者123 更新时间:2023-11-27 22:40:28 26 4
gpt4 key购买 nike

下面的case有内存泄漏吗?我想在 foo() 中,delete *e 只能看到对象的基础部分。 *e = NULL 是不是也引用了 Base 对象?

不好意思,我用的是gcc4.4.7。

这样做的好方法是什么?任何建议都将不胜感激!

class Base
{
public:
Base() {}
virtual ~Base() {}
virtual bool valid() { return true; }
}

class Derived : public Base
{
public:
Derived() {}
~Derived() {}
bool valid() { return false; }
}

void foo(Base** e)
{
if((*e)->valid() {
cout << "is valid";
}
else{
cout<< " not valid";
delete *e;
*e = NULL;
}
}

int main()
{
Derived* d = new Derived;
Base* cast_d = static_cast<Base*>(d);
foo(&cast_d);
}

最佳答案

这根本不是内存泄漏。当我们删除基类指针时,如果基类指针持有派生类对象的地址,它将首先调用派生类析构函数(如果声明为虚拟)。这就是为什么我们在 C++ 中有虚拟析构函数但没有虚拟构造函数的原因。如果我们使用基类指针来存储各种派生类指针的地址,我们应该始终将派生类析构函数声明为虚拟的,以便内存释放应该以正确的顺序完成。

希望对您有所帮助。

关于c++ - 这是删除基类指针的内存泄漏吗,如何改正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49439660/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com