代码之家  ›  专栏  ›  技术社区  ›  Greg Domjan

是否有方法更改共享资源的现有实例上的删除操作?

c++
  •  8
  • Greg Domjan  · 技术社区  · 14 年前

    我有一个函数,我希望90%的时间内完成一个清理操作,但在10%的时间内,我希望完成一些其他操作。

    有什么方法可以使用标准范围的控件吗? shared_ptr<> 这样,最初它可以有一个删除操作,然后在函数中更改删除操作?

    shared_ptr<T> ptr( new T, std::mem_fun_ref(&T::deleteMe) );
    ptr.pn.d = std::mem_fun_ref(&T::queueMe);
    
    3 回复  |  直到 9 年前
        1
  •  2
  •   ereOn    14 年前

    我不认为你能改变删除者一旦 shared_ptr 创建。

    但你为什么要这么做?通常,当你创建一个对象时,你会立即知道它是如何被销毁的。这不太可能改变。

    如果您真的必须做一些特定的处理,您仍然可以提供一个自定义的删除程序,它根据所需的逻辑执行特殊的操作。

        2
  •  2
  •   John Sampson    9 年前

    有正当理由需要更改删除程序。例如:

    int foo( std::shared_ptr<double>& bar ) {
        ...
        std::shared_ptr<double> p( my_allocator<double>::allocate(), my_deleter<double>() );
        bar.swap(p); // this copies the deleter
        ...
    }
    
    int main( int, char** ) {
        std::shared_ptr<double> d;
        foo( d ); // d now has a new deleter that will be called when it goes out of scope
        ...
    }
    

    在这种情况下,foo()函数使用一些特殊的分配器分配一个double*。它还需要以一种特殊的方式释放内存。调用者不需要知道如何释放内存。

        3
  •  0
  •   Kuba hasn't forgotten Monica    9 年前

    这没有任何意义,因为 shared_ptr 管理价值的所有权。你需要全部修改它们,这是不可行的。不要忘记控制块是一个实现细节,所以“aha,but change it in the control block”不会起作用。

    删除操作应由拥有的实例控制 SelddPPTR ,例如

    class C {
    ...
      void (C::action*)() { &C::action1 };
      void action1();
      void action2();
      ~C() { (this->*action)(); }
    };
    
    void test() {
      std::shared_ptr<C> a;
      a->action = &C::action2;
      // action2 gets invoked once `a` falls out of scope
    }