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)
我想它与基类中的析构函数的语法有关.即使我为子类创建自定义析构函数,也会出现同样的问题.
有任何想法吗?
在C++中,构造函数在层次结构中向上调用,即在创建时Derived,Base()在之前执行Derived().这意味着您正在运行objPtr = new SomeObject;两次,并且只删除一次.
您还应该使您的基类析构函数为虚拟,特别是如果您将从ptr中删除Derived实例Base.