小编Xu *_*Pan的帖子

为什么我们不能轻易复制std :: function

我要问这个的原因是我需要存储std::function在一个向量中,而我们公司内部的向量基本上是在需要更多内存的情况下进行realloc.(基本上memcpy,没有复制/移动操作员参与)

这意味着我们可以放入容器中的所有元素都需要可以轻松复制.

这里有一些代码来演示我有问题的副本:

void* func1Buffer = malloc(sizeof(std::function<void(int)>));
std::function<void(int)>* func1p = new (func1Buffer) std::function<void(int)>();
std::function<void(int)>* func2p = nullptr;
*func1p = [](int) {};
char func2Buffer[sizeof(*func1p)];
memcpy(&func2Buffer, func1p, sizeof(*func1p));
func2p = (std::function<void(int)>*)(func2Buffer);
// func2p is still valid here
(*func2p)(10);
free(func1Buffer);
// func2p is now invalid, even without std::function<void(int)> desctructor get triggered
(*func2p)(10);
Run Code Online (Sandbox Code Playgroud)

我知道我们应该支持元素的复制/移动以便std::function安全存储.但我仍然很好奇std::function上面无效复制的直接原因是什么.

-------------------------------------------------- --UpdateLine ----------------------------------------------- -----

更新了代码示例.

通过调试我们的内部向量,我找到了这种失败的直接原因.

平凡的复制std::function有一些依赖于原始对象的内存,删除原始内存将垃圾严重复制std::function甚至没有原始对象的破坏.

感谢大家对这篇文章的回答.这都是有价值的投入.:)

c++ c++11 std-function

12
推荐指数
1
解决办法
1862
查看次数

标签 统计

c++ ×1

c++11 ×1

std-function ×1