我正在将浮点处理的数据复制到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)
。很有可能,代码就可以工作了。