删除指向子类的指针时,C++内存未释放

Rya*_*uck 4 c++ inheritance dynamic-memory-allocation

我在我的代码中使用动态内存分配,并在尝试删除指向子类的指针时遇到问题.我发现当我使用delete关键字时,最初分配的内存不会被释放.该功能适用​​于原始基类.

这是一个问题,因为我在arduino上运行代码,RAM很快被吃掉然后崩溃.

这是一些示例代码:

class Base
{
public:
    Base(){
        objPtr = new SomeObject;
    }
    ~Base(){
        delete objPtr;
    }
    SomeObject* objPtr;
};

class Sub : public Base
{
public:
    Sub(){
        objPtr = new SomeObject;
    }
};



// this works fine
int main()
{
    for (int n=0;n<100;n++) // or any arbitrary number
    {
        Base* basePtr = new Base;
        delete basePtr;
    }
    return 0;
}

// this crashes the arduino (runs out of RAM)
int main()
{
    for (int n=0;n<100;n++) // or any arbitrary number
    {
        Sub* subPtr = new Sub;
        delete subPtr;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想它与基类中的析构函数的语法有关.即使我为子类创建自定义析构函数,也会出现同样的问题.

有任何想法吗?

con*_*gus 5

在C++中,构造函数在层次结构中向上调用,即在创建时Derived,Base()在之前执行Derived().这意味着您正在运行objPtr = new SomeObject;两次,并且只删除一次.

您还应该使您的基类析构函数为虚拟,特别是如果您将从ptr中删除Derived实例Base.