std::bad_alloc:以特征为单位确定缓冲区大小
std::bad_alloc: determining the buffer size in Eigen
我使用本征矩阵格式来读取先前获取的多维数据:
Eigen::Matrix<unsigned long long, Eigen::Dynamic, 12> dummyData;
后来在知道我的数据大小后:
dummyData.resize(PackSize, 12);
PackSize
可以按6e08
顺序排列。为了避免在计算缓冲区大小时出现整数溢出,我使用 unsigend long long
来解决 win32 上的(PackSize* 12*8) mod (2^32)
。然而,我想出了:Unhandled exception at 0x75362F71 in DataRead.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x004CBCF0
.有人可以帮我解决这个问题吗?
我不完全确定你想unsigned long long
作为矩阵的标量类型;从数学上讲,矩阵应该在场上定义,你必须意识到,如果你试图找到一个正整数的乘法逆(即无符号整数,你必须将你的无符号整数乘以得到1),环理论对你来说并不容易。
但是,这在 Eigen 中是合法的,所以我们只会坚持下去——也许你不想对矩阵进行需要你字段的这些属性的操作。
所以,你说的是你使用的是win32(这是Windows API),但并不是你的操作系统是32位还是64位。如果您运行的是 32 位窗口,则任何进程的虚拟地址空间都不能超过 2GB,并且分配超过 2GB/sizeof(长)无符号长长将不起作用。现在,长 long 是 64bit=8Byte,因此每 2GB 的最大uint64_t数为 134217728;现在,您希望将它们放在 12 列的行中,最多留出 11,184,810 行(忽略了您的数字不是进程内存中唯一的东西这一事实)。现在,11e6 <6e8,您必须考虑这样一个事实,即您不知道 Eigen 尝试使用哪种类型的分配器,这实际上可能会尝试分配比立即必要的分配器更多。
不过,最有可能的是,您的 12 列格式也会填充到更好地对齐的内容上。Eigen 文档对此并不太具体,我认为实际实现取决于您的特征库是如何编译的,所以我通常不能很好地建议你。您可以尝试使用特征::矩阵模板中的DontAlign
选项。
- 以天C++为单位的两个时间戳之间的差异
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 从原始字节解码协议缓冲区(以 C++为单位)
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 编写以 C++ 为单位返回值的函数
- 以C++为单位进行运行长度编码
- 如何找到两个日期之间的时间差异(以秒和纳秒为单位)?
- arr[n] 是否以 C++ 为单位打印数组的长度?
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 以 C++ 为单位具有输出限制的排列
- 以 GDB 为单位指定浮点精度
- 整数数据如何以位为单位存储在内存中?不是右对齐吗?
- 如何在没有硬编码的情况下以C++为单位获取类数组的长度?
- 指针引用的生存期(以 C++为单位)
- 以字符为单位设置控制台大小
- 获取嵌套 stl 容器的大小(以字节为单位)
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 二进制数组中最大连续 1 的起始和结束索引,以 C++ 为单位
- visual 在指向缓冲区(字符串 " ")的空指针上使用 sizeof() C++ 以获得以字节为单位的大小?
- std::bad_alloc:以特征为单位确定缓冲区大小