执行在push_back暂停

时间:2019-11-20 02:18:59

标签: c++ vector push-back

以下for循环在第一个循环中暂停执行,我不知道为什么。我已经知道,通过将提示放置在其中,它会在push_back处停止。之前它在工作,然后我尝试对其进行修改,然后我执行了Ctrl-z使其恢复到此状态,现在它似乎在以前似乎没有出现时突然在push_back处停止。发生了什么事?

#include <iostream>
#include <vector>
using namespace std;
void decode(int[], int, int[][2]);
void displayArray(int[], int);

int main()
{
    const int SIZE = 12;
    int test[SIZE-2] = {3,9,1,4,8,0,11,5,1,8};
    int edgeList[SIZE-1][2];
    for (int i = 0; i < SIZE -1; i++)
    {
        edgeList[i][0] = -1;
        edgeList[i][1] = -1;
    }
    decode(test, SIZE, edgeList);
    return 0;
}

void decode(int inputString[], int size, int edgeList[][2])
{
    int** arrayC = new int*[size - 2];
    for(int i = 0; i < size - 2; i++)
        arrayC[i] = new int[2];
    for (int i = 0; i < size -2 ; i++)
    {
        arrayC[i][0] = i+1;
        arrayC[i][1] = inputString[i];
    }

    for (int i = 0; i < size - 2; i++)
    {
        displayArray(arrayC[i], 2);
    }

    for (int i = 0; i < size - 1; i++)
    {
        vector<int> currentCycle;
        int *visited = new int[size - 2];
        for(int j = 0; j < size - 1; j++)
        {
            visited[j] = 0;
        }
        bool repeat = false;
        int currentIndex = i;
        while(!repeat)
        {
            int curElem = arrayC[currentIndex][0];
            if (!visited[curElem] && curElem != 0 && curElem != size - 1)
            {
                cout << curElem << endl;
                currentCycle.emplace_back(curElem);
                visited[curElem] = 1;
            }
            else
            {
                repeat = true;
            }
            currentIndex = arrayC[currentIndex][1] - 1;
            if (currentIndex == -1 || currentIndex == size -2)
            {
                repeat = true;
                currentCycle.push_back(-1);
            }
        }
        for (int i = 0; i < currentCycle.size(); i++)
            cout << currentCycle[i] << " ";
        cout << endl;
        delete visited;
    }
}

void displayArray(int array[], int size)
{
    for (int i = 0; i < size; i++)
    {
        cout << array[i] << " ";
    }
    cout << endl;
}

1 个答案:

答案 0 :(得分:0)

    int *visited = new int[size - 2];

size是12。这将分配10个整数数组:visited[0]visited[9]

    for(int j = 0; j < size - 1; j++)

for循环使用j从0到10进行迭代。size - 1为11。因此,此循环中j的最后一个值为10。 >

        visited[j] = 0;

最终,这将尝试将visited[10]设置为0。

失败。 visited数组太小。仅visited[0]visited[9]有效。这会导致内存损坏和不确定的行为。

这可能是也可能不是所示代码中的唯一错误。这是使用出色的静态内存分析工具valgrind轻松发现的第一个内存访问冲突,它在发生内存损坏时停止了该程序的执行,使我可以使用调试器闯入程序,检查所有变量的值,并轻松找出问题所在。

值得花一些时间来学习如何使用调试和诊断工具,例如这些工具。它们确实可以帮助您快速地在自己的代码中查找错误。

该代码的总体用途尚不清楚,因此不清楚正确的解决方案应该是什么,因此我在找到第一个showstopper之后就停了下来。正如我简要提到的那样,修复此问题之后,可能还会有其他类似的问题。如果是这样,您应该能够以与我相同的方式找到它们,并借助一些可能已经拥有的有用工具的帮助。