首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11:我可以显式调用基类析构函数来销毁派生类吗?

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

Stack Overflow用户
提问于 2017-08-29 21:38:05
回答 1查看 385关注 0票数 1

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

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

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

这是一些密码。它没有显示未使用的对象是如何在池中存储和检索的。但这与眼前的问题并不相关。

代码语言:javascript
复制
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 call ~BaseClass() and ~ChildClass()?
    obj->~MemoryPoolObject();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-29 22:04:57

所以..。如果我对~MemoryPoolObject()进行显式调用,这会做正确的事情(包括调用任何乘法继承基类的析构函数)吗?

是的,会的。

然而,我认为您可以稍微改变策略,使您的代码更直观。

operator newoperator delete中重载MemoryPoolObject,让用户按照通常的方式使用operator newoperator delete

一个示例程序:

代码语言:javascript
复制
#include <iostream>
using namespace std;

void* allocate(size_t s)
{
   // This is a simple implementation.
   // To use a memory pool for allocating objects, this function
   // and deallocate() need to be changed accordingly.

   std::cout << "Allocating memory of size " << s << std::endl;
   return new char[s];
}

void deallocate(void* ptr, size_t s)
{
   std::cout << "Dellocating memory of size " << s << std::endl;
   delete [] static_cast<char*>(ptr);
}

class MemoryPoolObject
{
   public:

      virtual ~MemoryPoolObject() {}

      void* operator new (size_t s)
      {
         return allocate(s);
      }

      void operator delete (void* ptr, size_t s)
      {
         return deallocate(ptr, s);
      }
};

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

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

int main()
{
   MemoryPoolObject* ptr = new ChildClass;
   delete ptr;
}

输出

代码语言:javascript
复制
Allocating memory of size 16
Dellocating memory of size 16
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45948692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档