c++ - 为什么 shared_ptr 没有虚拟析构函数? (我该如何解决这个问题?)

标签 c++ shared-ptr virtual-destructor

我想制作一个特殊版本的 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/

相关文章:

C++ 继承和 valgrind 内存泄漏

c++ - 访问继承函数

c++ - 使用 'pointer' 和结构调用 DLL (C++ -> VB.NET)

c++ - 更新 g++ 但仍然是旧版本

c++ - 以多态方式删除对象

c++ - 为什么是虚拟析构函数?

c++ - 当我从剪贴板粘贴到外部程序时,为什么 Qt 程序会处理剪贴板数据?

c++ - 为什么 shared_ptr<T> 期望在 T 中复制/移动构造函数?

C++11引用计数智能指针设计

c++ - 苹果和 shared_ptr