有没有办法在共享的现有实例上更改删除操作
我有一个功能,我希望在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