C++11:我可以显式调用基类析构函数来销毁派生类吗
C++11: Can I explicitly call a base class destructor to destroy the derived class?
我正在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 call ~BaseClass() and ~ChildClass()?
obj->~MemoryPoolObject();
}
所以。。。如果我对
~MemoryPoolObject()
进行显式调用,会做正确的事情吗(包括调用任何乘法继承基类的析构函数(?
是的,会的。
不过,我认为您可以稍微更改策略,使代码更加直观。
在MemoryPoolObject
中重载operator new
和operator delete
,并让用户按常规方式使用operator new
和operator delete
。
示例程序:
#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;
}
输出
Allocating memory of size 16
Dellocating memory of size 16
相关文章:
- 使用基类指针创建对象时,缺少派生类析构函数
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 从 c++ 中派生类的析构函数调用虚函数
- 如何从 Gtk::窗口调用派生对象的析构函数
- 在派生类中将公共父析构函数设为私有
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- C++11:我可以显式调用基类析构函数来销毁派生类吗
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- 受保护的析构函数禁用在堆栈上创建派生类的对象?
- 防止派生析构函数中的 vtable 数据争用
- 如何在另一个类的向量中调用派生类的析构函数
- 了解派生类中C++析构函数的行为
- 私有派生析构函数
- 在派生类中重写哪个基类的虚拟析构函数
- 基类没有析构函数,但派生类有析构函数。我是否需要寻找与堆无关的任何陷阱?
- 显式声明派生类中所需的析构函数
- 调用派生类的析构函数
- 在这种情况下,我的派生类是否还需要一个虚拟析构函数
- g++对基类析构函数和派生类指针的未定义引用
- 基析构函数如何调用派生析构函数