gpt4 book ai didi

c++ - boost::bind 内部拷贝/拷贝?

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

我希望了解 boost::bind 执行何种函数对象的内部拷贝。由于这些对象的构造函数似乎没有被调用,我推测这是一种“非常浅的复制”,所以我引入了动态内存分配来产生一些错误。但是,下面代码的运行时输出似乎表明 三个 对 bind 生成的内部拷贝的额外析构函数调用。

using namespace std;
using namespace boost;

class M{
int *somedata;
public:
M(){ somedata=new int[5]; cout<<"from cstr\n"; somedata[1]=0;}
~M(){cout<<"from dstr\n"; delete somedata;}

int operator()(int i){ cout<<++somedata[i]<<endl; return 0;}
};


int main()
{
M instM;

bind<int>(instM,1)();
//bind<int>(&M::operator(),&instM,1)(); //this works with no errors, of course

instM(1); //would not change the order of output

return 0;
}

输出...呈现了一些额外的谜题 - 例如。为什么第一个 dstr 事件发生在调用 operator() 之前?还要注意最后一次失败的析构函数调用之前的“2​​”。

from cstr
from dstr
1
from dstr
bind_copy(73365) malloc: *** error for object 0x1001b0: double free
*** set a breakpoint in malloc_error_break to debug
from dstr
bind_copy(73365) malloc: *** error for object 0x1001b0: double free
*** set a breakpoint in malloc_error_break to debug
2
from dstr
bind_copy(73365) malloc: *** error for object 0x1001b0: double free
*** set a breakpoint in malloc_error_break to debug

所以问题是:任何人都可以简单地解释一下 bind 以什么顺序生成什么样的拷贝?

... 经过一番思考,我意识到 bind 只是使用(这里是默认的)复制构造函数。在提供了这个 cstr 的一些自定义版本(带有内存分配和拷贝的尽可能深的版本)之后,输出变得干净(应该如此),但难题仍然存在:三个 复制构造函数的调用。 所以在这种情况下,boost::bind 制作了函数对象的三个 拷贝。为什么以及以何种顺序?(对于嵌套的 boost::binds 这可能导致内部拷贝数量的爆炸式增长。)

定义了 cp-cstr 并添加了一些“继承标记”的输出(“P”=parent,每个 cp cstr 添加“-C”):

 from cstr P
from cp cstr P-C
from cp cstr P-C-C
from cp cstr P-C-C-C
from dstr P-C-C
P-C-C-C:1
from dstr P-C-C-C
from dstr P-C
P:1
from dstr P

最佳答案

参见 here :

By default, bind makes a copy of the provided function object. boost::ref and boost::cref can be used to make it store a reference to the function object, rather than a copy. This can be useful when the function object is noncopyable, expensive to copy, or contains state; of course, in this case the programmer is expected to ensure that the function object is not destroyed while it's still being used.

关于c++ - boost::bind 内部拷贝/拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9704794/

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