Исключение нарушения доступа происходит с использованием C ++ Stream API - PullRequest
0 голосов
/ 17 ноября 2018

Чтобы упростить манипуляции с контейнерами, я хотел найти API с такими же функциями, как у известного Java 8 Stream API, но в C ++.После некоторых исследований я обнаружил, что потоковая библиотека Джона Шейнермана C ++ доступна по следующей ссылке:

https://bitbucket.org/jscheiny/streams

Я попытался выполнить следующий код с помощью Visual Studio Community 2017 для тестирования API:

#include <Stream.h>

int main() {

    MakeStream::from({ 1, 2, 3, 4, 5 })
        .for_each([](int value) {
        std::cout << value << std::endl;
    });
    return (EXIT_SUCCESS);
}

Пока здесь нет проблем.Код правильно отображает числа.

Но когда я инициализирую вектор в переменной:

#include <Stream.h>

int main() {

    std::vector<int> x = { 1, 2, 3, 4, 5 };
    MakeStream::from(x)
        .for_each([](int value) {
        std::cout << value << std::endl;
    });
    return (EXIT_SUCCESS);
}

У меня есть место записи нарушения прав доступа по адресу 0xDDDDDDDD в заголовочном файле xutility.

enter image description here

Проблема возникает при уничтожении вектора.

Я действительно потерялся.Кто-нибудь может сказать мне, что происходит?

Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 17 ноября 2018

Проблема здесь заключается в том, что библиотека использует витые иерархии классов (включая такие причудливые вещи, как классы шаблонов, фактически наследующие различные специализации своего вида), но во всех классах отсутствуют виртуальные деструкторы, поэтому уничтожение объектов не выполняется правильно, и итераторы отладки VS будутвызвать ошибку во время очистки.В частности, базовый класс StreamImpl<int, Common> будет иметь поле ::std::unique_ptr<StreamProvider<int>>, которое будет использоваться для хранения экземпляра класса IteratorStreamProvider<int, ::std::vector<int>::const_iterator>.

Добавление виртуального деструктора везде, начиная с StreamImpl и StreamProvider, делает этопроблема исчезнет.

Также я бы сказал, что использование этой библиотеки приведет вас в направлении, противоположном «упростить мои манипуляции с контейнерами».

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