指针,动态数组和内存泄漏

时间:2017-09-16 02:09:23

标签: c++ arrays memory-leaks dynamic-arrays

我正在尝试创建一个程序,它允许动态分配的数组存储一些整数,如果需要可以增加最大大小,然后按顺序显示未排序和排序的数组。

链接到我的完整代码位于底部。

我遇到的第一个问题是动态分配的数组在大小需要第一次增加之后才会变得干扰。相关代码如下。

    while (counter <= arraySize)
    {
        cout <<"Please enter an integer number. Use 999999 (six 9's) to stop\n";
        if (counter == arraySize)           //If the counter is equal to the size of the array
        {                                   //the array must be resized
            arraySize +=2;
            int *temp = new int[arraySize];
            for (counter = 0; counter < arraySize; counter++)
            {
                temp[counter] = arrayPtr[counter];
            }
            delete [] arrayPtr;
            arrayPtr = temp;
            counter ++;                     //the counter has to be reset to it's original position
        }                                   //which should be +1 of the end of the old array
        cin >> arrayPtr[counter];
        if (arrayPtr[counter] == sentinel)
        {
            cout << "Sentinel Value given, data entry ending.\n";
            break;
        }
        counter ++;
    }

这会产生非预期的操作,而不是等待sentinel值,它只是开始列出该点之后的内存中的整数(因为没有边界检查)。

下一个问题是我的排序功能拒绝运行。我尝试在5个值上测试它,程序只是在达到代码的特定部分时崩溃。

使用

调用该函数
sorting (arrayPtr);

但功能本身如下:

void sorting (int *arr)
{
    int count = 0, countTwo = 0, tempVal;

    for (count = 0; arr[count] != 999999; count++)          //I figured arr[count] != 999999 is easier and looks better
    {                                                       //A bunch of if statements
        for (countTwo = 0; arr[countTwo] != 99999; countTwo++)
        {
            if (arr[countTwo] > arr[countTwo+1])
            {
                tempVal = arr[countTwo];
                arr[countTwo] = arr[countTwo+1];
                arr[countTwo+1] = tempVal;
            }
        }
    }   
}

对此问题的任何帮助表示赞赏。

链接到我的源代码:

http://www.mediafire.com/file/w08su2hap57fkwo/Lab1_2336.cpp

由于社群反馈,此链接将尽可能长时间保持有效

以下链接是我更正的源代码。它是注释的,以便更好地突出我所犯的错误和解决它们的答案。

http://www.mediafire.com/file/1z7hd4w8smnwn29/Lab1_2336_corrected.cpp

1 个答案:

答案 0 :(得分:0)

我可以在代码中看到的第一个问题是for循环,其中counter从0到arraySize-1,循环的最后两次迭代将访问arrrayPtr超出范围。

接下来,在if (counter == arraySize)的末尾有一个counter++;这不是必需的,因为此时counter已经将数组索引越界了。

最后在你的排序函数中,内部循环查找错误的值(99999而不是999999),因此它永远不会停止并超出界限。要防止出现此类错误,您应该将sentinel定义为未命名的命名空间中的const,并通过代码使用它而不是键入999999(这很容易出错......)。