std::bad_alloc:以特征为单位确定缓冲区大小



我使用本征矩阵格式来读取先前获取的多维数据:

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选项。

最新更新