为什么shared_ptr没有虚拟析构函数?(我怎么能绕过这个?)

Ale*_*lex 0 c++ shared-ptr virtual-destructor

我想制作一个特殊的版本,shared_ptr在创建或销毁它时执行特定的操作,但是我的计划似乎被实现了shared_ptr析构函数是非虚拟的,这意味着当我覆盖它时,我的指针永远不会被清除当它们的最后一个实例被销毁时.

想到的唯一选择是将这种行为建立在我想用于我的假设习惯的每个类中shared_ptr,这是不可行的(或者在某些情况下可能).

编辑:

我想要这个的原因是因为我想在lua中使用一些类作为userdata对象,并且我希望我使用这种方式的每个对象都有一个独特的fenv表,当所有引用都被清除时对象已被删除.我打算使用指针的地址,因为它们键入一个包含fenv表的表.

让我们说我有一个小部件可以有其他小部件作为孩子.我在Lua中创建了两个小部件,然后将一个小部件设置为另一个小部件,并删除对子小部件的所有lua引用(事实上它是一个用C++处理的子节点).GC现在可以随时运行并移除孩子.我不一定希望孩子运行它的析构函数,所以我想让它成为一个shared_ptr.这样,在Lua清理它之后,C++对象仍然可以使用它.如果我已将值或函数分配给它的fenv,我仍然希望能够访问它们.只有在删除对子窗口小部件的最终引用时,才能完全删除fenv tabled.

Mar*_*ork 8

它已经内置了这种能力,而不需要让人们从中获取危险的东西:

#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);

}
Run Code Online (Sandbox Code Playgroud)

导出的问题:
就在我的头顶.

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;
}
Run Code Online (Sandbox Code Playgroud)

  • @Alex:因为你将'shared_ptr`取为**值**,而不是引用,因此派生意味着对象切片.想一想:你想要在堆上分配`shared_ptr` :)? (2认同)