我是C ++和Microsoft Visual Studio的新手,我目前正在为我的数据结构课程实验室工作,我已经完成了我的代码,但是当我构建并运行我的程序时抛出此错误:
std::bad_alloc at memory location 0x0018C9C0.
我用Google搜索了这个错误,我发现如果没有为程序分配足够的内存或者程序试图为某些内容分配无限的内存,则会抛出此错误。我试图在程序属性中分配更多内存,但这似乎没有帮助。查看我的代码,我无法找到任何会引发此错误的内容。这是我的参考代码:
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main() {
string line;
string value;
string linesArray[200];
int i = 0;
int j = 0;
int finalLine = 158;
getline(cin, line, '\n');
getline(cin, line, '\n');
/* First Line */
for (i; i < finalLine; ++i) {
getline(cin, line, '\n');
for (j; j <= 24; ++j) {
if (j = 0) {
line = line.replace(line.find(','), line.find_first_of(','), string(30 - line.find(','), ' '));
}
line = line.replace(line.find(','), line.find_first_of(','), string(20 - line.find(','), ' '));
}
linesArray[i] = value;
cout << linesArray[i] << endl;
}
return 0;
}
我尝试创建一个指针,找到它在错误中显示的地址,但我无法找到它。非常感谢任何帮助。
编辑:对不起,我没有说清楚,我的输入是一个csv格式的txt文件。我接收信息并在每行的第一列放置30个空格减去值的长度,在剩下的值上放置20个空格减去值的长度,除非没有值,其中我用19个空格放置零。示例输入:
Albania,14,29365,43301,,,,,,,13,27867,41066,,,,,,,1,1498,2235,,,
答案 0 :(得分:2)
改变这个:
if (j = 0) {
到此:
if (j == 0) {
开始。再试一次......
我不怀疑你的代码会分配那么多内存来抛出std::bad_alloc
异常。
每当您for-loop *的明星执行j = 0
时,您就会创建一个无限循环 ...
请注意,在纠正之后,我在使用expression result unused
标志进行编译时会收到-Wall
的两个警告,这不是导致问题的原因,但理解这一点会很好:
for (j; j <= 24; ++j) {
不需要j
并产生警告,请按以下方式编写:
for (; j <= 24; ++j) {
因为您不想在那里初始化j
。
答案 1 :(得分:1)
让我们考虑line="xyz,abc"
的价值,根据您的代码,j==0
,代码有效,而line
将具有替换','
的更新值,以下是'line'
之后的replace
的输出,
xyz c
现在,对于第二次迭代,在替换变量line
时,您发现','
即line.find(',')
,line
字符串中不存在std::find()'
std::string::npos
将返回pos
,这是您必须处理异常的地方,
对于{{1}}参数
要替换的第一个字符的位置。 如果这大于字符串长度,则抛出out_of_range。
我想你现在有了。
答案 2 :(得分:1)
前两个getline没有意义,它们会被 i 循环中的getline覆盖。值字符串永远不会被赋值任何值。然后你需要一些输入,这似乎需要特殊格式 - 因为行替换对我可以编写的任何字符串没有任何意义。如果我们要了解您要做的事情,我们需要知道输入字符串的格式。
在任何操作后插入循环变量 i 和 j 的打印语句和行字符串,如下所示:
/* First Line */
for (i; i < finalLine; ++i) {
getline(cin, line, '\n');
line = line.replace(line.find(','), line.find_first_of(','), string(30 - line.find(','), ' '));
cout << "[i=" << i << "] " << line << endl;
for (j; j <= 24; ++j) {
line = line.replace(line.find(','), line.find_first_of(','), string(20 - line.find(','), ' '));
cout << "[j=" << j << "] " << line << endl;
}
linesArray[i] = line;
cout << linesArray[i] << endl;
}
另外,我将第一行替换为 j 循环。
当我运行代码时,第一个替换产生了乱码,这可能对您特殊格式化的字符串有更多意义。然后它在内部循环中的第一个 j = 0 替换时崩溃。因此,简而言之,打印每个操作的结果,您将更容易看到正在发生的事情。