gpt4 book ai didi

c++ - 在使用中删除 boost 功能

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:02 24 4
gpt4 key购买 nike

我遇到这样一种情况,boost::function 和 boost::bind(实际上是 std::tr1::function 和 bind)在使用中被删除了。这样安全吗?我通常会避免它,但有问题的代码有点根深蒂固,我唯一的其他选择是添加一个新线程。

typedef function<int(int)> foo_type;

foo_type* global_foo = NULL;

int actual_foo( int i, Magic* m )
{
delete global_foo;
return m->magic(i);
}

int main()
{
Magic m;
global_foo = new foo_type( bind( &actual_foo, _1, &m );

return (*global_foo)(10)
}

绑定(bind)参数始终是普通整数类型(实际代码中的 int 和指针),而不是引用。

最佳答案

boost::functionstd::tr1::functions是可复制的对象。因此,通常绝对没有理由分配它们——只需按值传递它们即可。

它们针对大​​多数实际情况进行了很好的优化...所以只需按值传递它们:

typedef function<int(int)> foo_type;

foo_type global_foo;

int actual_foo( int i, Magic* m )
{
delete global_foo;
return m->magic(i);
}

int main()
{
Magic m;
global_foo = bind( &actual_foo, _1, &m );

return global_foo(10)
}

你建议的代码是危险的,运行这段代码:

    #include <boost/function.hpp>
#include <boost/bind.hpp>
#include <iostream>
using namespace std;

boost::function<void()> *glb;

struct Data {
int x;
Data(int _x = 0) : x(_x) { cout<<"ctor:"<<this<<endl; }
~Data() { cout<<"dtor:"<<this<<endl; }
Data(Data const &p) {x=p.x; cout<<"ctor:"<<this<<endl; }
Data const &operator=(Data const &p) { x=p.x; cout<<this<<"="<<&p<<endl; return *this; }
};

void func(Data const &x)
{
delete glb;
cout<<&x<<endl;
}

int main()
{
glb=new boost::function<void()>(boost::bind(func,Data(3)));

(*glb)();
return 0;
}

你会发现你尝试访问funccout<<&x<<endl 中显示的已销毁对象(具有相同指针值的 dtor)已经被调用了。

因为当你销毁你的函数对象时,你也销毁了你绑定(bind)的参数有和Data const &x变得不可用,因为它已被 global_function 破坏

编辑:评论清除:

如果你有类似的东西

map<string,function<void()> > calls;

void delete_key(){
calls.erase("key");
}

main()
{
calls["key"]=delete_key;

// Wrong and dangerous
// You delete function while in use
calls["key"]();

// Correct and safe
// You create a copy of function so it would not
// be deleted while in use.
function<void()> f=calls["key"];
f();
}

关于c++ - 在使用中删除 boost 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1273900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com