Is there a way to change the delete action on an existing instance of shared

I have a function where I want a cleanup action done 90% of the time, but in 10% I want some other action to be done.

Is there some way to use some standard scoped control like shared_ptr<> so that initially it can have one delete action and then later in the function the delete action can be changed?

shared_ptr<T> ptr( new T, std::mem_fun_ref(&T::deleteMe) );
ptr.pn.d = std::mem_fun_ref(&T::queueMe);

I don't think you can change the deleter once the shared_ptr was created.

But why would you do that ? Usually, when you create an object, you know immediatly how it must be destroyed. This is not likely to change.

If you really must do some specific treatments, you still can provide a custom deleter which does special things depending on the required logic.


There is a valid reason to need to change the deleter. Take this for example:

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
    ...
}

In this case the foo() function allocates a double* using some special allocator. It needs to free that memory in a special way also. The caller shouldn't need to know how to free the memory.


This doesn't make any sense, since there is any number of shared_ptr s managing the ownership of the value. You'd need to modify them all, and that's not feasible. Let's not forget that a control block is an implementation detail, so going "aha, but change it in the control block" won't work.

The delete actions should be controlled by the instance owned by shared_ptr , eg

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/46690.html

上一篇: iPad方向更改问题

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