我想制作一个特殊版本的 shared_ptr
,它会在创建或销毁时执行特定操作,但我的计划似乎因 shared_ptr
的实现而受挫的析构函数是非虚拟的,这意味着当我覆盖它时,当它们的最后一个实例被销毁时,我的指针永远不会被清理。
想到的唯一选择是将此行为构建到我想与我假设的自定义 shared_ptr
一起使用的每个类中,但这是不可行的(或者在某些情况下是不可能的)。
编辑:
我想要这个的原因是因为我想在 lua 中使用一些类作为 userdata 对象,我希望我使用这种方式的每个对象都有一个唯一的 fenv 表,当所有的时候都会被清理对该对象的引用已被删除。我计划在指针键入包含 fenv 表的表时使用指针的地址。
假设我有一个小部件,可以将其他小部件作为子部件。我在 Lua 中创建了两个小部件,然后将一个设置为另一个的子部件,并删除了所有对子部件的 lua 引用(事实上,它是一个子部件是在 C++ 中处理的)。 GC 现在可以随时运行并删除 child 。我不一定希望 child 运行它的析构函数,所以我想让它成为一个 shared_ptr。这样,C++ 对象在 Lua 清理后仍然可以使用它。如果我已经为它的 fenv 分配了值或函数,我仍然希望能够访问它们。只有当对我的子部件的最终引用被删除时,我才希望 fenv 表被完全删除。
最佳答案
它已经内置了这种能力,不需要让人们做危险的事情,比如从中衍生:
#include <boost/shared_ptr.hpp>
#include <iostream>
/*
* Done as a function for simplicity.
* But this can be done in so many ways
*/
void MyCleanup(int* x)
{
std::cout << "DONE\n";
delete x;
}
int main()
{
boost::shared_ptr<int> x(new int(5), MyCleanup);
}
推导问题:
就在我的脑海里。
class X: public shared_ptr<int> { /* STUFF. With a special destructor. */ };
int main()
{
/* what happens now? Similar to slicing but not quite */
X data1(new int(5));
shared_ptr<int> data2;
shared_ptr<int> data3(data);
data2 = data1;
}
关于c++ - 为什么 shared_ptr 没有虚拟析构函数? (我该如何解决这个问题?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3801648/