【问题标题】:Why is the program crashing?为什么程序会崩溃?
【发布时间】:2012-02-28 00:17:30
【问题描述】:

我正在制作一个 c++ 程序,它应该从标准输入中读取一个整数 N。然后它应该从文件“data.txt”中读取值到一个大小为 N 的数组中。然后它应该将它传递给一个反转的函数数组并返回一个指向新数组的指针。然后它应该打印返回的指针数组的内容。但是每次我运行程序它都会崩溃。有什么想法吗?

#include <iostream>
#include <fstream>

using namespace std;

int * reverseArray(int * arr, const int size)
{
//int arr1[size];
int *arr2 = new int[size];
for(int iii = 0; iii < size; iii++)
{
    (*(arr2+iii)) = (*(arr + size - 1 - iii));
}

return arr2;
}

int main()
{
int N;
cin >> N;
if(N >= 0 && N <= 50)
{
    ifstream inputFile;
    inputFile.open("data.txt");
    int *arr = new int[N];
    int iii = 0;
    while(inputFile >> (*(arr+iii)) && iii < N)
    {    iii++;}

    arr = reverseArray(arr, N);

    for(int jjj = 0; jjj < N; jjj++)
    {
        cout << (*(arr+jjj)) << endl;
    }

    delete [] arr;
    inputFile.close();
}

return 0;
}

【问题讨论】:

  • 你能发布你得到的确切错误吗?
  • 那么,它在哪里崩溃了?如果这是 C++,为什么不使用std::vectorstd::reverse?此外,您正在泄漏您最初分配给arr 的内存(这也是切换到std::vector 的好理由)。
  • 在所需位置是否存在data.txt
  • 哪一行崩溃了?
  • 快速看了一下,明显漏水但是看不到目前崩溃在哪里

标签: c++ crash


【解决方案1】:

我认为问题出在这里:

while(inputFile >> (*(arr+iii)) && iii < N)

确保iii 小于N 的检查发生在访问之后。重新排序条件:

while(iii < N && inputFile >> (*(arr+iii)) )

注意这一行引入了内存泄漏:

arr = reverseArray(arr, N);

由于这是 C++,请考虑改用 std::vector&lt;int&gt;

【讨论】:

  • 哇,你们太棒了。这正是问题所在,我只是颠倒了顺序,我相信我通过将函数的返回分配给另一个指针并删除那个指针来消除内存泄漏。谢谢!
  • @ScottFink,如果这解决了问题,你能accept the answer吗?
【解决方案2】:

我建议将其更改为以下内容。虽然会指出如果 N

while (iii < N && inputFile.good())
{
    inputFile >> *(arr+iii);
    ++iii;
}

int *arrRev = reverseArray(arr, N);

for(int jjj = 0; jjj < N; ++jjj)
{
    cout << (*(arrRev+jjj)) << endl;
}

delete [] arr;
delete [] arrRev;
inputFile.close();

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2017-03-26
    相关资源
    最近更新 更多