170 похожих чатов

Всем привет. изучаю тему аллокаторов через написание собственного. почему-то при

попытке освободить память в деструкторе (строка 22) код не отрабатывает до конца, под отладкой получаю Access violation. Если закомментировать - всё нормально отрабатывает. не могу понять почему... помогите разобраться?
https://pastebin.com/VnCCAPZY

21 ответов

14 просмотров

А зачем тебе алокаторы?

Arthur- Автор вопроса
Ilya Zviagin
А зачем тебе алокаторы?

я не знаю, задание такое 😄

Arthur- Автор вопроса

в https://www.onlinegdb.com/ отрабатывает нормально...

Я думаю, тут с копированием у тебя проблемы... КОпирование надо описывать.

Arthur- Автор вопроса
Ilya Zviagin
Так задание-то где?

задание не важно, нужно исправить проблему :)

Arthur- Автор вопроса
Ilya Zviagin
Копирование в свой класс добавь

мне не нужно копирование, при копировании мне достаточно создавать независимые экземпляры аллокатора. и откуда уверенность что добавление копирования решит проблему?

Arthur
мне не нужно копирование, при копировании мне дост...

а сейчас при копировании аллокатор копируется почленно, что приводит к UB в деструкторе из-за некорректной дефолтной реализации копирования. если копирование не нужно, как минимум напиши allocator(const allocator&) = delete и дальше уже выясняй, почему копируется

Arthur
мне не нужно копирование, при копировании мне дост...

Тебе НУЖНО КОПИРОВАНИЕ иначе у тебя два Алокатора будут владеть одним и тем же блоком памяти, на который указывает data

Arthur- Автор вопроса
Ilya Zviagin
Тебе НУЖНО КОПИРОВАНИЕ иначе у тебя два Алокатора ...

с чего это вдруг они будут владеть одним и тем же блоком памяти?

Arthur
с чего это вдруг они будут владеть одним и тем же ...

Выше тебе Саша объяснил же. Дефолтный конструктор копирования - почленное копирование объекта. data будет скопирован, и потом когда одна из копий объекта будет удалена, её деструктор удалит память, на которую ссылается data, будет удалена, а в другом экземпляре аллокатора в data останется ссылка на уже удалённую память. Правда, как этот сценарий реализуется в твоём конкретном примере, я не знаю - надо ходить отладчиком.

Arthur- Автор вопроса
Ilya Zviagin
Выше тебе Саша объяснил же. Дефолтный конструктор ...

спасибо! посмотрю что там происходит, теперь знаю куда копать

Arthur
спасибо! посмотрю что там происходит, теперь знаю ...

Важнее чтобы у тебя бы сформировался рефлекс: если объект владеет каким-то ресурсом, мы обязательно либо запрещаем копирование, либо реализуем его правильно (либо move используем)

Копировать аллокатор вообще считаю плохой идеей. Контейнер должен сам распоряжаться ресурсами.

Arthur- Автор вопроса
Dmitriy [Отпуск]
Копировать аллокатор вообще считаю плохой идеей. К...

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

Arthur- Автор вопроса
Arthur
спасибо :)

Да просто запрети копирование

Arthur- Автор вопроса
Alexander Karaev
а сейчас при копировании аллокатор копируется почл...

Добавил вот такой конструктор копирования: 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"; } Он так же вызывает конструктор по умолчания. Проблема всё еще осталась. Почленного копирования здесь ведь не происходит, так?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта