попытке освободить память в деструкторе (строка 22) код не отрабатывает до конца, под отладкой получаю Access violation. Если закомментировать - всё нормально отрабатывает. не могу понять почему... помогите разобраться?
https://pastebin.com/VnCCAPZY
А зачем тебе алокаторы?
я не знаю, задание такое 😄
в https://www.onlinegdb.com/ отрабатывает нормально...
Я думаю, тут с копированием у тебя проблемы... КОпирование надо описывать.
Так задание-то где?
задание не важно, нужно исправить проблему :)
Копирование в свой класс добавь
мне не нужно копирование, при копировании мне достаточно создавать независимые экземпляры аллокатора. и откуда уверенность что добавление копирования решит проблему?
а сейчас при копировании аллокатор копируется почленно, что приводит к UB в деструкторе из-за некорректной дефолтной реализации копирования. если копирование не нужно, как минимум напиши allocator(const allocator&) = delete и дальше уже выясняй, почему копируется
спасибо за пояснение!
Тебе НУЖНО КОПИРОВАНИЕ иначе у тебя два Алокатора будут владеть одним и тем же блоком памяти, на который указывает data
с чего это вдруг они будут владеть одним и тем же блоком памяти?
Выше тебе Саша объяснил же. Дефолтный конструктор копирования - почленное копирование объекта. data будет скопирован, и потом когда одна из копий объекта будет удалена, её деструктор удалит память, на которую ссылается data, будет удалена, а в другом экземпляре аллокатора в data останется ссылка на уже удалённую память. Правда, как этот сценарий реализуется в твоём конкретном примере, я не знаю - надо ходить отладчиком.
спасибо! посмотрю что там происходит, теперь знаю куда копать
Важнее чтобы у тебя бы сформировался рефлекс: если объект владеет каким-то ресурсом, мы обязательно либо запрещаем копирование, либо реализуем его правильно (либо move используем)
Копировать аллокатор вообще считаю плохой идеей. Контейнер должен сам распоряжаться ресурсами.
вот мне и не нужно чтобы он копировался. они все должны быть независимыми
Копай в сторону propagate_on_*
Да просто запрети копирование
Добавил вот такой конструктор копирования: custom_allocator(const custom_allocator<T, N> &) noexcept: custom_allocator() { std::cout << "COPY CONSTRUCTOR T->T" << __FUNCSIG__ << "\n"; } То есть он просто вызывает конструктор по умолчанию. Этот конструктор копирования не вызывается. Вызывается другой: template <typename U> custom_allocator(const custom_allocator<U, N> &) noexcept : custom_allocator() { std::cout << "COPY CONSTRUCTOR T->U" << __FUNCSIG__ << "\n"; } Он так же вызывает конструктор по умолчания. Проблема всё еще осталась. Почленного копирования здесь ведь не происходит, так?
Обсуждают сегодня