Различные результаты после отладки и компиляции программ на C++

StackOverflow https://stackoverflow.com/questions/1989805

Вопрос

Я запускаю CodeBlocks в компиляторе MingW на виртуальной машине XP.Я написал простой код, доступный по адресу кл1п , который отвечает на вопрос алгоритма в КодШеф (Ну, это отвечает на него лишь частично, поскольку я еще не включил цикл для нескольких тестовых случаев.

Однако моя проблема в том, что при запуске в режиме отладки он дает правильный вывод 5 для ввода:

3
1
2 1
1 2 3

Однако, когда я собираю и запускаю его, он выдает абсурдный огромный результат 131078, который мне кажется мусором.Я не понимаю, как, черт возьми, это происходит, но предполагаю, что это как-то связано с динамическим распределением памяти.В чем здесь проблема и как ее исправить?Я даже прогнал его через онлайн-компилятор на БотШкола, и это сработало нормально.После добавления цикла для тестовых случаев код даже на CodeChef работал корректно!

#include <iostream>

using namespace std;

int main()
{
    // Take In number of rows
    int numofrows;
    cin >> numofrows;

    // Input Only item in first row
    int * prevrow;
    prevrow = new int[1];
    cin >> prevrow[0];

    // For every other row
    for (int currownum = 1; currownum < numofrows; currownum++)
    {
        // Declare an array for that row's max values
        int * currow;
        currow = new int[currownum+1];

        int curnum;
        cin >> curnum;

        // If its the first element, max is prevmax + current input
        currow[0] = prevrow[0] + curnum;

        // for every element
        int i = 1;
        for (; i <= currownum; i++)
        {
            cin >> curnum;

            // if its not the first element, check whether prevmax or prev-1max is greater. Add to current input
            int max = (prevrow[i] > prevrow[i-1]) ? prevrow[i] : prevrow[i-1];

            // save as currmax.
            currow[i] = max + curnum;
        }

        // save entire array in prev
        prevrow = new int[i+1];
        prevrow = currow;
    }

    // get highest element of array
    int ans = 0;
    for (int j=0; j<numofrows; j++)
    {
        if (prevrow[j] > ans)
        {
            ans = prevrow[j];
        }
    }

    cout << ans;
}
Это было полезно?

Решение

Во-первых, это:

    //save entire array in prev
    prevrow = new int [i+1];
    prevrow = currow;

копирует указатель, а не весь массив.

Другие советы

Запустите код через Valgrind на машине с Linux, и вы удивитесь, сколько мест в вашем коде вызывает утечку памяти.Если вы идете по сложному пути управления своей памятью, сделайте это хорошо и «удалите» всю вновь выделенную память, прежде чем выделять еще.С другой стороны, если вы предпочитаете легкий путь, используйте std::vector и забудьте об управлении памятью.

В вашем цикле у вас есть эта строка

int max = (prevrow[i]>prevrow[i-1])?prevrow[i]:prevrow[i-1];

На первой итерации основного цикла, когда currownum == 1, будет введен цикл, содержащий эту строку, как i инициализируется как 1.Но на первой итерации prevrow имеет только один элемент, и эта строка пытается получить доступ prevrow[1].В отладочной сборке память просто инициализируется нулем, но в обычной сборке вы получаете какое-то мусорное значение, которое случайно оказалось в памяти, что приводит к результату, который вы видите.

Практически всегда, когда вы получаете мусорные значения в обычной сборке, а в отладочной сборке все в порядке, вы получаете доступ к некоторой неинициализированной памяти.

Кроме того, ваша программа имеет сумасшедшую утечку памяти.Например, вам не нужно присваивать какой-либо результат new внутри цикла, чтобы prevrow потому что сразу после этого ты меняешься prevrow чтобы указать на другой блок выделенной памяти.Также вам следует позвонить delete для любой памяти, которую вы больше не используете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top