std::bad_alloc in a c++ vector



我正在将浮点处理的数据复制到std矢量,我每3个值添加一个0,这样我就可以得到一个4个值的帧。vector的大小小于data的最大值max_size() = 1 073 741 823。vector的总大小为data.size()=55 000 000.

问题是,当我运行我的应用程序,特别是当保存数据到新的矢量时,应用程序自动停止,我得到std::bad_alloc错误。

有人对这个问题有什么看法吗?我正在使用QTcreator,该应用程序在32位运行,我从继承的公共类获得处理过的数据。DATA_getAllMeasurments()[我]→DPacket。DATA_Packet是数据向量。
void FileGenerate::GeneratePDOfile(uint8 i, std::string  path){
std::vector <float>data;
int size = DATA_getAllMeasurments()[i]->DPacket.DATA_Packet.size();
int newsize= (size *4)/3; 
unsigned int m =0;

for (int k=0; k<newsize ; k++){
if (k%4==0)
data.push_back(0.0);
else            
data.push_back(DATA_getAllMeasurments()[i]->DPacket.DATA_Packet[m++]);              

}    
std::string path2 = path + "/Measurement" +std::to_string(i+1)+".pdo";
std::ofstream myFile (path2, std::ios::out | std::ios::binary);
myFile.write((char *)&(data[0]),data.size() *sizeof (float));
myFile.close();
data.clear();
}

函数std::vector::max_size()报告标准库支持的最大大小.

编译时求值,并且不报告您的程序可能正在运行的系统的运行时能力。

也就是说,您的系统可能没有足够的连续内存来分配所需的空间。即使您的操作系统报告了足够的"空闲空间",std::vector也被设计成要求连续的空间。

通过不断增加向量,您正在分割进程的寻址空间,而在32位进程中,这是有限的资源。

幸运的是,有一个简单的解决方案-在进入for循环之前调用data.reserve (new size)。很有可能,代码就可以工作了。

最新更新