我有一个非常基本的反射实现,其中包括一个Type
类,该类对其所描述的类进行对象实例化。分解为相关部分,看起来像这样:
Type.h:
class Plugin; // forward declaration
typedef std::unique_ptr<Plugin> PluginPtr;
namespace Reflection {
class Type {
public:
explicit Type(PluginPtr(*)());
PluginPtr CreateInstance();
private:
PluginPtr(*_createInstance_Handler)();
};
}
Type.cpp:
Type::Type(PluginPtr(*createInstance_Handler)()) :
_createInstance_Handler(createInstance_Handler) {}
PluginPtr CreateInstance() { return (*_createInstance_Handler)(); }
实际的实例化逻辑位于Plugin
类中(及其每个子类中):
Plugin.h:
class Plugin {
public:
virtual ~Plugin();
static const Reflection::Type Type;
private:
static PluginPtr CreateInstance();
插件.cpp
Plugin::~Plugin() {}
const Reflection::Type Plugin::Type(CreateInstance);
PluginPtr Plugin::CreateInstance() { return PluginPtr(new Plugin); }
当我尝试对此进行编译时,出现以下错误(在Visual Studio 2013中):
error C2027: use of undefined type 'Plugin'
error C2338: can't delete an incomplete type
warning C4150: deletion of pointer to incomplete type 'Plugin'; no destructor called
我仔细研究了一下,显然这是由std :: unique_ptr的删除器引起的(在正在操作的类的类定义中发现自己)。我在某处读到,如果我提供自己的删除器,此问题将消失。所以我重新定义PluginPtr
为:
typedef std::unique_ptr<Plugin, PluginDeleter> PluginPtr
(编译)问题确实消失了,但是问题是,是否可以/应该手动进行此PluginDeleter
调用~Plugin()
(以确保正确地破坏了插件(以及PluginPtr可能指向的任何派生对象!))?还有我应该在哪里/如何最好地声明/定义它,以免出现类型不完整的问题?
(或者是否有更好的方法?)
PS。现在,在处理我的源代码时,我意识到上面的代码有错误。Type.cpp的最后一行应显示为
PluginPtr CreateInstance() { return (_createInstance_Handler)(); }
的Deleterstd::unique_ptr
应该删除该对象,也就是说销毁它(如您可以假设的那样),然后在需要时释放所使用的内存。
如果您的自定义删除程序使用delete
运算符,那么您不必手动调用析构函数为:
delete
是一个具有非常特定行为的运算符:使用delete运算符的表达式,首先调用适当的析构函数(针对类类型),然后调用函数运算符delete
(即此函数)以释放存储。
如果使用静态分配的内存或在静态分配的内存中的新放置指针创建的指针,或者在应用程序退出之前不会释放的内存(例如),则不应调用delete
运算符,但仍然必须销毁该指针。对象,因此您必须调用对象的析构函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句