将新放置与 std::函数一起使用不起作用
Using placement new with an std::function doesn't work
此代码在(*function)()
时崩溃。我正在运行Visual Studio 2019并为Windows 10 x86_64编译C++17。我已经在Linux上用GCC(-std=c++17(测试过它,它工作正常。我想知道这是Visual Studio的C++编译器的问题还是我没有看到的问题。
#include <vector>
#include <array>
#include <functional>
#include <iostream>
int main() {
const size_t blockSize = sizeof(std::function<void()>);
using block = std::array<char, blockSize>;
std::vector<block> blocks;
auto lambda = [](){
std::cout << "The lambda was successfully called.n";
};
blocks.emplace_back();
new (&blocks[0]) std::function<void()>(lambda);
blocks.emplace_back();
new (&blocks[1]) std::function<void()>(lambda);
std::function<void()> *function = (std::function<void()> *)blocks[0].data();
(*function)();
return 0;
}
该错误是 std::函数内部的读取访问冲突。
当您将元素附加到std::vector
并且该元素会使向量的大小大于其容量时,向量必须分配新的存储空间并将其所有元素复制/移动到新空间。 虽然您在向量中保存的char
数组中构造了复杂的std::function
对象,但向量并不知道这一点。 组成std::function
对象的基础字节将被复制到向量的新存储中,但std::function
的复制/移动构造函数不会被调用。
最好的解决方案是直接使用std::vector<std::function<void()>>
。 如果出于某种原因必须使用原始存储块的向量,则需要在开始插入元素之前预先分配空间。 即
int main() {
const size_t blockSize = sizeof(std::function<void()>);
using block = std::array<char, blockSize>;
std::vector<block> blocks;
auto lambda = [](){
std::cout << "The lambda was successfully called.n";
};
blocks.reserve(2); // pre-allocate space for 2 blocks
blocks.emplace_back();
new (&blocks[0]) std::function<void()>(lambda);
blocks.emplace_back();
new (&blocks[1]) std::function<void()>(lambda);
std::function<void()> *function = (std::function<void()> *)blocks[0].data();
(*function)();
return 0;
}
现场演示
或者,您可以使用不同的数据结构,例如在添加或删除元素时保持稳定地址的std::list
。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 将新放置与 std::函数一起使用不起作用
- 当我使用长整型时,我的代码不起作用,它与 int 一起工作得很好
- 将字符串转换为char,当我cout时,它是正确的,但是当我将chdir与char一起使用时,它不起作用
- boost::与boost:asio绑定在一起.boost::绑定不起作用,从示例中复制
- 将DLL与python一起使用(使用ctypes),不起作用
- 将unique_ptr与 boost boost::shared_ptr 一起使用有效,但unique_ptr不起作用
- 为什么这种将emplace_back与已删除的复制构造函数一起使用不起作用?
- 我可以将 #define 指令与 :: 一起使用吗?为什么它不起作用?
- Seekg 在将 iStream 与自定义 Streambuf 一起使用时不起作用