内存分配不够?
Not enough memory allocation?
我是 C++ 和 Microsoft 的新手 Visual Studio,我目前正在研究我的数据结构 class,我已经完成了我的代码,但是当我构建和 运行 我的程序抛出这个错误:
std::bad_alloc at memory location 0x0018C9C0.
我用谷歌搜索了这个错误,我发现如果没有为程序分配足够的内存或者程序试图为某些东西分配无限量的内存,就会抛出这个错误。我试图在程序属性中分配更多内存,但这似乎没有帮助。查看我的代码,我找不到任何会引发此错误的内容。这是我的代码供参考:
#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,,,
改变这个:
if (j = 0) {
对此:
if (j == 0) {
首先。再试一次...
我不怀疑你的代码分配了那么多内存来抛出 std::bad_alloc
异常。
当你每次在 for-loop* 的星星 执行 j = 0
时,你会创建一个 无限循环 ...
请注意,在更正之后,在使用 -Wall
标志进行编译时,我收到了两个 expression result unused
警告,这不是问题的原因,但最好理解:
for (j; j <= 24; ++j) {
不需要j
在那里并产生警告,这样写:
for (; j <= 24; ++j) {
因为你不想在那里初始化 j
。
让我们根据您的代码考虑 line="xyz,abc"
的值,对于 j==0
,代码有效并且 line
将具有更新值,其中 ','
被替换,以下是第一个 replace
、
之后 'line'
的输出
xyz c
现在,对于第二次迭代,在替换变量 line
时,您会找到 ','
即 line.find(',')
,它不存在于 line
字符串中而 std::find()'
将 return std::string::npos
,这是你必须处理异常的地方,
下面的url表示string::replace,你可以发现,对于pos
参数
Position of the first character to be replaced.
If this is greater than the string length, it throws out_of_range.
我想你现在明白了。
前两个 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 替换时崩溃。所以,简而言之,打印每个操作的结果,你会更容易看到发生了什么。
我是 C++ 和 Microsoft 的新手 Visual Studio,我目前正在研究我的数据结构 class,我已经完成了我的代码,但是当我构建和 运行 我的程序抛出这个错误:
std::bad_alloc at memory location 0x0018C9C0.
我用谷歌搜索了这个错误,我发现如果没有为程序分配足够的内存或者程序试图为某些东西分配无限量的内存,就会抛出这个错误。我试图在程序属性中分配更多内存,但这似乎没有帮助。查看我的代码,我找不到任何会引发此错误的内容。这是我的代码供参考:
#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,,,
改变这个:
if (j = 0) {
对此:
if (j == 0) {
首先。再试一次...
我不怀疑你的代码分配了那么多内存来抛出 std::bad_alloc
异常。
当你每次在 for-loop* 的星星 执行 j = 0
时,你会创建一个 无限循环 ...
请注意,在更正之后,在使用 -Wall
标志进行编译时,我收到了两个 expression result unused
警告,这不是问题的原因,但最好理解:
for (j; j <= 24; ++j) {
不需要j
在那里并产生警告,这样写:
for (; j <= 24; ++j) {
因为你不想在那里初始化 j
。
让我们根据您的代码考虑 line="xyz,abc"
的值,对于 j==0
,代码有效并且 line
将具有更新值,其中 ','
被替换,以下是第一个 replace
、
'line'
的输出
xyz c
现在,对于第二次迭代,在替换变量 line
时,您会找到 ','
即 line.find(',')
,它不存在于 line
字符串中而 std::find()'
将 return std::string::npos
,这是你必须处理异常的地方,
下面的url表示string::replace,你可以发现,对于pos
参数
Position of the first character to be replaced. If this is greater than the string length, it throws out_of_range.
我想你现在明白了。
前两个 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 替换时崩溃。所以,简而言之,打印每个操作的结果,你会更容易看到发生了什么。