内存分配不足? 我是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;icout前两个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;icout
if(j=0)
这显然是错误的。也许你的意思是
if(j==0)
只是一个安全细节,但我建议将finalLine声明为const,这样你就可以确定它不会在循环中的某个地方扩展。(据我所知,它不会扩展,但它更像是一个安全预防措施,而且它让你少担心一件事)您的第一步应该是在调试器中运行代码,并确定错误发生在代码中的何处。永远不要取消选中io:您应该确保
找到(',')
合理的内容(在您的情况下,它应该小于
j==0?30:20
,否则它将下溢并在
std::string(20-line.find(','))中分配一个巨大的字符串)
等。要使示例完整,您需要向程序中添加示例输入。回滚上次编辑,因为修改后的代码使现有答案无效。
如果(j=0)
这显然是错误的。您的意思可能是
如果(j==0)
j