【发布时间】:2011-04-17 15:06:53
【问题描述】:
我想制作一个特殊版本的shared_ptr,它可以在创建或销毁它时执行特定操作,但我的计划似乎因意识到shared_ptr 的析构函数是非虚拟的而受挫,这意味着当我覆盖它,当它们的最后一个实例被销毁时,我的指针永远不会被清理。
想到的唯一替代方法是将这种行为构建到我想与我假设的自定义 shared_ptr 一起使用的每个类中,这是不可行的(或在某些情况下是可能的)。
编辑:
我想要这个的原因是因为我想在 lua 中使用一些类作为 userdata 对象,并且我希望我使用这种方式的每个对象都有一个唯一的 fenv 表,当所有的对对象的引用已被删除。我计划使用指针的地址,因为它们键入包含 fenv 表的表。
假设我有一个可以将其他小部件作为子小部件的小部件。我在 Lua 中创建了两个小部件,然后将一个设置为另一个的子小部件,并删除对子小部件的所有 lua 引用(它是一个子小部件的事实在 C++ 中处理)。 GC 现在可以随时运行并删除子代。我不一定想让孩子运行它的析构函数,所以我想让它成为一个 shared_ptr。这样,在 Lua 清理之后,C++ 对象仍然可以使用它。如果我已经为其 fenv 分配了值或功能,我仍然希望能够访问它们。只有在删除对我的子小部件的最终引用时,我才希望完全删除 fenv 表。
【问题讨论】:
-
您能告诉我们您打算在
shared_ptr的专业化方面做什么吗?可能有其他方法.. -
像往常一样,告诉我们目标而不是步骤。它没有虚拟析构函数,因为它不是基类。
-
更新了问题,说明我想这样做的原因。
-
如果你想让
shared_ptr有一个虚拟析构函数,那么你对shared_ptr的用途有一个根本的误解。shared_ptr的全部意义在于它充当值类型。听起来您只需要提供一个自定义删除器,为什么这在您的情况下不起作用? -
因为我不知道自定义删除器:)
标签: c++ shared-ptr virtual-destructor