деструктор вектора вызывается немедленно и вызывает двойное освобождение или повреждение (выход) - PullRequest
0 голосов
/ 28 мая 2020

У меня есть функция, в которой деструктор вектора вызывается немедленно и вызывает ошибку. Я видел это с помощью отладчика QtCreator

enter image description here

Но когда я закомментировал следующую строку, она работает (не так, как ожидалось, но, по крайней мере, не дает ошибок).

#include <algorithm>
#include <cmath>
#include <functional>
#include <iostream>
#include <vector>


class Solution {
private:
    int min_cost(const std::vector<int>& costs, std::vector<int>& map, int start) const
    {
        //        if (map[start] > -1)
        //            return map[start];

        const int s = costs.size();
        if (start >= s - 2)
            return costs[start];

        int c1 = min_cost(costs, map, start + 1);
        int c2 = min_cost(costs, map, start + 2);

        int cost = std::min(c1, c2);

        if (start > -1)
            cost += costs[start];

        map[start] = cost;
        return cost;
    }

public:
    int minCostClimbingStairs(const std::vector<int>& costs) const
    {
        std::vector<int> map(costs.size(), -1); // from debuder, std::vector<int>::~vector is called here
        return min_cost(costs, map, -1); // commeting out this line out dont gives error
    }
};

int main()
{
    const std::vector<std::vector<int>> input = {
        { 10, 15 },
        { 10, 15, 20 },
        { 1, 100, 1, 1, 1, 100, 1, 1, 100, 1 },
        { 0, 0, 0, 0 }
    };

    const Solution Sol;

    for (auto const& i : input) {
        std::cout << ' ' << Sol.minCostClimbingStairs(i) << '\n';
    }
}

Но Как функция min может повлиять на деструктор вектора? вот fiddle Я тестировал код с g ++ 10.1.0 и clang ++ 10.0.0

1 Ответ

3 голосов
/ 28 мая 2020

Программа вызывает неопределенное поведение:

map[start] = cost;

выполняется, когда start равно -1, который обращается за пределами вектора.


Также вы неверная интерпретация вывода отладчика. Порядок операций для функции minCostClimbingStairs:

  • Создать map
  • Вызов min_cost
  • Уничтожить map
  • Возврат

Первые две вещи происходят, а затем во время уничтожения map повреждение кучи, вызванное записью вне границ, проявляется как ошибка времени выполнения при попытке уничтожить ее.

Если вы пошагово выполняете программу построчно, вы сможете следовать этому потоку. Я предполагаю, что вы запускали программу в отладчике без пошагового выполнения и ждали, пока она остановится, но не осознавали, что остановка произошла после вызова min_cost. Выходные данные трассировки стека показывают текущее состояние стека, и min_cost не отображается в нем, поскольку эта функция уже вернулась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...