有没有办法在共享的现有实例上更改删除操作

我有一个功能,我希望在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);

我认为一旦创建了shared_ptr ,您就不能更改删除程序。

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

如果你真的必须做一些特定的处理,你仍然可以提供一个定制的删除器,根据所需的逻辑做特殊的事情。


有一个合理的理由需要更改删除者。 以此为例:

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 *。 它需要以特殊的方式释放内存。 调用者不需要知道如何释放内存。


这没有任何意义,因为有任何数量的shared_ptr管理值的所有权。 你需要修改它们,这是不可行的。 我们不要忘记,一个控制块是一个实现细节,所以去“aha,但在控制块中改变它”将不起作用。

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

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
}
链接地址: http://www.djcxy.com/p/46689.html

上一篇: Is there a way to change the delete action on an existing instance of shared

下一篇: Sample C code for Canon EDSDK Liveview?