我的代码的简化版本如下:
int * tab = nullptr;
int index = 0;
int size = 1; // Program works unless this is init'd to something higher!
int a = 0;
while (true)
{
int input;
std::cin >> input;
if (input == 0) break;
index++;
if (index >= size) {
size = size * 2;
int * newt = new int[size];
for (int i = 0; i < a; ++i)
newt[i] = tab[i];
delete[] tab;
tab = newt;
}
tab[a] = input;
a++;
}
每当我尝试将'size'整数更改为大于1时,程序就会崩溃。 Visual Studio大喊有关内存可访问性的问题,但我仍然无法弄清楚到底是什么问题。 我不必更改它,但是我一直在努力处理此代码超过一个小时,直到我不小心将变量更改为1,然后它才起作用。我很好奇为什么。
答案 0 :(得分:3)
如果your_file_1.txt
大于1,则size
在第一次迭代中将不成立,导致index >= size
指向某事物的代码均未执行,因此tab
访问权限已损坏。
您的算法很难遵循,因此除了建议重新设计之外,我没有提出具体的解决方案。
答案 1 :(得分:2)
在这里,我对修订版的处理方式:
#include <iomanip>
#include <iostream>
#include <sstream>
int main()
{
int *tab = nullptr;
int len = 0, size = 0;
std::stringstream in;
in << "1 2 3 4 5 6 7 8 9 10 0";
while (true)
{
int input;
//std::cin >> input;
in >> input;
if (input == 0) break;
if (len >= size) {
size = std::max(2 * size, 1);
int * newt = new int[size];
for (int i = 0; i < len; ++i) newt[i] = tab[i];
delete[] tab;
tab = newt;
}
tab[len++] = input;
}
for (int i = 0; i < len; ++i) std::cout << ' ' << tab[i];
std::cout << '\n';
return 0;
}
输出:
1 2 3 4 5 6 7 8 9 10
我必须承认,我仍然不明白为什么要破坏原始版本。
我尝试了 coliru ,它似乎运行良好(尽管我知道–运行良好并不意味着没有U.B.)。知道了。