小编Kev*_*ill的帖子

C++ 11:我可以显式调用基类析构函数来销毁派生类吗?

我正在用C++ 11实现一个内存池.存储在内存池中的所有对象都需要从MemoryPoolObject类继承,但它们可能使用多重继承.

当我分配一个新对象时,我使用malloc来创建它,然后使用placement构造函数 - 我可以做,因为我知道它的类型(allocate()是一个模板函数,它将类型作为模板参数).我还将其大小存储在其上的对象上(作为MemoryPoolObject类的成员变量).

当我释放对象时,我想调用它的析构函数.但我不再知道对象类型.我知道它派生自MemoryPoolObject,它有一个虚拟析构函数.所以...如果我对~MemoryPoolObject()进行显式调用,那么它会做正确的事情(包括调用任何多重继承的基类的析构函数)吗?

这是一些代码.它没有显示如何在池中存储和检索未使用的对象.但这与手头的问题无关.

class BaseClass
{
public:
    virtual ~BaseClass();
    ...
};

class MemoryPoolObject
{
public:
    virtual ~MemoryPoolObject();

    // In reality I don't just expose this, but for simplicity...
    size_t m_ObjectSize;
};

class ChildClass : public BaseClass, public MemoryPoolObject
{
    virtual ~ChildClass();
    ...
};

// allocation (simplified)
template<class T> 
T* allocate()
{
    size_t objectSize = sizeof(T);
    T* obj = (T*)malloc(objectSize);
    new(obj) T();
    obj->m_ObjectSize = objectSize;
}

// deallocation (also simplified)
void deallocate(MemoryPoolObject* obj)
{
    // Does this …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

1
推荐指数
1
解决办法
164
查看次数

标签 统计

c++ ×1

c++11 ×1