我有一个很大的vector<string>
我需要处理的(大约 100 万个大小):
stringstream numStr;
cout << "before loop" << endl;
for(unsigned int i = 0; i < numList.size(); i++) {
cout << i << ": " << ((NORM_MAX - NORM_MIN) * (atoi(numList[i].c_str()) - min)) / (max - min) + NORM_MIN << endl;
int number = ((NORM_MAX - NORM_MIN) * (atoi(numList[i].c_str()) - min)) / (max - min) + NORM_MIN;
numStr << number;
numList[i] = numStr.str();
}
但是,程序在到达 36691 ~ 36693 时崩溃
(snip)
36689: 288
36690: 264
36691: 245
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
我该怎么做才能找出这个问题的原因?
最佳答案
就目前的代码而言,您拥有 stringstream
在循环之外,这意味着您不断地将新数字一遍又一遍地附加到现有流的末尾,然后在每次循环迭代中存储ENTIRE LIST:
numList[i] = "... 288"
numList[i+1] = "... 288 264"
numList[i+2] = "... 288 264 245"
等等……
所以是的,这将最终在尝试分配单个时耗尽内存string
如果 numList.size()
,则其中包含格式化的完整列表非常大。
您可能打算将 stringstream
在循环内,以便每次迭代格式化并存储一个单个 int
每个值 numList
插槽:
cout << "before loop" << endl;
for(unsigned int i = 0; i < numList.size(); i++) {
int number = ((NORM_MAX - NORM_MIN) * (atoi(numList[i].c_str()) - min)) / (max - min) + NORM_MIN;
cout << i << ": " << number << endl;
stringstream numStr;
numStr << number;
numList[i] = numStr.str();
}
numList[i] = "288"
numList[i+1] = "264"
numList[i+2] = "245"
等等……
关于c++ - 使用 bad_alloc 处理大 vector 会使程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28933604/