内存分配不足? 我是C++和微软Visual Studio的新手,我现在正在为我的数据结构类做实验,我已经完成了我的代码,但是当我构建和运行我的程序时,它会造成这样的错误: std::bad_alloc at memory location 0x0018C9C0.
我在谷歌上搜索了这个错误,发现如果没有为程序分配足够的内存,或者程序试图为某些东西分配无限量的内存,就会抛出这个错误。我试图在程序属性中分配更多内存,但似乎没有帮助。查看我的代码,我找不到任何会抛出此错误的内容。以下是我的代码供参考:内存分配不足? 我是C++和微软Visual Studio的新手,我现在正在为我的数据结构类做实验,我已经完成了我的代码,但是当我构建和运行我的程序时,它会造成这样的错误: std::bad_alloc at memory location 0x0018C9C0.,c++,visual-studio,loops,out-of-memory,bad-alloc,for-loop,C++,Visual Studio,Loops,Out Of Memory,Bad Alloc,For Loop,我在谷歌上搜索了这个错误,发现如果没有为程序分配足够的内存,或者程序试图为某些东西分配无限量的内存,就会抛出这个错误。我试图在程序属性中分配更多内存,但似乎没有帮助。查看我的代码,我找不到任何会抛出此错误的内容。以下是我的代码供参考: #include <iostream> #include <iomanip> #include <string> using namespace std; int main() { string line; s
#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;
}
更改此项:
if (j = 0) {
为此:
if (j == 0) {
首先。然后再试一次
我不怀疑您的代码分配了那么多内存来抛出std::bad\u alloc
异常
当您每次在*星上执行
j=0
时,您将创建一个无限循环
请注意,在更正该错误后,当使用
-Wall
标志编译时,我收到了两条关于表达式结果未使用的警告,这不是问题的原因,但最好了解:
for (j; j <= 24; ++j) {
因为您不想在那里初始化j
。更改此选项:
if (j = 0) {
为此:
if (j == 0) {
首先。然后再试一次
我不怀疑您的代码分配了那么多内存来抛出std::bad\u alloc
异常
当您每次在*星上执行j=0
时,您将创建一个无限循环
请注意,在更正该错误后,当使用-Wall
标志编译时,我收到了两条关于表达式结果未使用的警告,这不是问题的原因,但最好了解:
for (j; j <= 24; ++j) {
因为您不想初始化<代码> j>代码> .< /p> 让我们考虑代码< >行=“XYZ,ABC”< /代码>,根据您的代码,对于<代码> j=0 ,代码工作,并且<代码>行<代码>将具有更新值,其中“代码>”、“< /代码>被替换,以下是第一次
更换后行的输出
xyz c
现在,对于第二次迭代,在替换变量line
时,您将找到,“
,即行。find(',)
,它不在行字符串中,而std::find()”
将返回std::string::npos
,这是您必须处理异常的地方,
下面的url告诉您,对于pos
参数
要替换的第一个字符的位置。
如果该值大于字符串长度,则抛出\u范围内的\u
<>我想你已经知道了。 让我们考虑代码< >行=“XYZ,ABC”<代码>,根据你的代码,对于<代码> j=0 ,代码工作,并且<<代码>行<代码>将有更新值,其中<代码>、“< /代码>被替换,以下是“<代码>”的行“< /代码>在第一个代码>替换< /代码>,
之后的更新值。
xyz c
现在,对于第二次迭代,在替换变量line
时,您将找到,“
,即行。find(',)
,它不在行字符串中,而std::find()”
将返回std::string::npos
,这是您必须处理异常的地方,
下面的url告诉您,对于pos
参数
要替换的第一个字符的位置。
如果该值大于字符串长度,则抛出\u范围内的\u
我想你现在明白了。前两个getline没有意义,它们被i循环中的getline覆盖。值字符串也从未被分配任何值。然后你需要一些输入,这似乎需要特殊的格式——因为换行对我能写的任何字符串都没有意义。如果我们想了解您想要做什么,我们需要知道输入字符串的格式
在任何操作之后,为循环变量i和j以及行字符串插入打印语句,如下所示:
for (; j <= 24; ++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;
}
/*第一行*/
对于(i;i cout前两个getline没有意义,它们被i循环中的getline覆盖。值字符串也从来没有被分配任何值。然后你需要一些输入,这似乎需要特殊的格式-因为行替换对我能写的任何字符串都没有意义。如果我们想了解我们需要知道输入字符串的格式
在任何操作之后,为循环变量i和j以及行字符串插入打印语句,如下所示:
for (; j <= 24; ++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;
}
/*第一行*/
对于(i;i coutif(j=0)
这显然是错误的。也许你的意思是if(j==0)
只是一个安全细节,但我建议将finalLine声明为const,这样你就可以确定它不会在循环中的某个地方扩展。(据我所知,它不会扩展,但它更像是一个安全预防措施,而且它让你少担心一件事)您的第一步应该是在调试器中运行代码,并确定错误发生在代码中的何处。永远不要取消选中io:您应该确保找到(',')
合理的内容(在您的情况下,它应该小于j==0?30:20
,否则它将下溢并在std::string(20-line.find(','))中分配一个巨大的字符串)
等。要使示例完整,您需要向程序中添加示例输入。回滚上次编辑,因为修改后的代码使现有答案无效。如果(j=0)
这显然是错误的。您的意思可能是如果(j==0)
j