40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
||||||
1 | ||||||
Ошибки с деаллокацией памяти, выделенной через placement new05.03.2021, 15:51. Показов 1461. Ответов 11
Всем привет, следующий код вызывает ошибку в деструкторе класса для объекта b при вызове delete[]. Не понимаю в чем тут проблема и прошу помочь мне ее исправить. Заранее благодарю!
0
|
05.03.2021, 15:51 | |
Ответы с готовыми решениями:
11
Освобождение памяти, выделенной через new Освобождение только части выделенной памяти через new Стоит ли при динамическом распределении памяти перехватывать возможные ошибки через try/catch? Удаление выделенной памяти |
2832 / 2337 / 707
Регистрация: 29.06.2020
Сообщений: 8,658
|
||||||
05.03.2021, 16:59 | 2 | |||||
У меня вопрос.
Почему выделяете память m_data = new T[arr.m_size]; а удаляете как char * operator delete[] ((char*)m_data); ??? и как оно должно работать ? Добавлено через 6 минут не проще дать компилятору самому просчитать сколько чего надо удалить ?
0
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
||||||
05.03.2021, 17:23 [ТС] | 3 | |||||
SmallEvil, так как я выделил char *, решил удалять тоже как char *. Но даже Вашим способом ошибку не исправляет. Ну и по поводу operator delete - "operator delete[] (m_data)" - вызов функции, через которую реализован оператор delete. Эта функция принимает void * и не вызывает деструкторы.
И вот я кстати не уверен, а вызовет ли delete [] m_data; деструкторы для T на всех платформах или это гарантирует компилятор (если я выделял под char)? Просто если это выполняется с помощью какой-то метаинформации и проверяется в самой делаокации, то это может быть проблемой. UPDATE: только щас понял вопрос, действительно, в конструкторе копирования я выделяю как T и это походу ошибка. >_< Добавлено через 8 минут SmallEvil, а так правильнее? Походу тут утечка, по-крайней мере ноет санитайзер, но я ее не вижу :c
0
|
2832 / 2337 / 707
Регистрация: 29.06.2020
Сообщений: 8,658
|
|
05.03.2021, 17:58 | 4 |
я так и не понял зачем Вам placment new здесь ?
0
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
|
05.03.2021, 18:01 [ТС] | 5 |
SmallEvil, мой конструктор принимает вторым параметром значение по умолчанию для всех элементов массива. Но если у объекта не будет конструктора по умолчанию, то я не смогу просто выделить new T[m_size], для этого я выделаю массив char'ов и на них уже по элементно вызываю копирующий конструктор объекта типа T для инициализации значением по умолчанию!
0
|
2832 / 2337 / 707
Регистрация: 29.06.2020
Сообщений: 8,658
|
||||||
05.03.2021, 18:35 | 6 | |||||
Сообщение было отмечено HamsterGamer как решение
Решение
я только мельком знакомился с placment new, тут надо серьзеней,
но Вы не выделили сырую память. Так тоже утечки ?
Добавлено через 1 минуту operator delete [](m_data);
1
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
|
05.03.2021, 18:36 [ТС] | 7 |
SmallEvil, да, но похоже дело не в них, а в том, что тестовая система куда я кидаю уже померла от старости. Так как санитайзер от gcc никаких утечек ни в мой и ни в Ваш код не кидает. Буду считать что моя реализация валидна. Спасибо за помощь!
Действительно, можно же было использовать ::operator new, кт по сути работает как malloc, спасибо. Буффер char'ов тут скорее лишний и может замедлить работу из-за выравниваний, которых не учтет ОС при выделении + на платформах, где char != 1 байт я сожру больше чем нужно!
0
|
фрилансер
5498 / 5094 / 1047
Регистрация: 11.10.2019
Сообщений: 13,341
|
|
05.03.2021, 18:42 | 8 |
HamsterGamer, если что, обёртка такая уже имеется в языке - std::optional
правда, там нужный размер заранее выделяется
1
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
|
05.03.2021, 18:46 [ТС] | 9 |
Алексей1153, да я знаю о нем, но по заданию было необходимо найти решение с помощью размещающего new
0
|
фрилансер
5498 / 5094 / 1047
Регистрация: 11.10.2019
Сообщений: 13,341
|
|
05.03.2021, 18:59 | 10 |
HamsterGamer, ну, тогда также должно быть известно про пачки параметров шаблонов и пробрасывающую ссылку. И решить передачу параметров в конструктор так же, как это делается в optional
0
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
||||||
05.03.2021, 19:08 [ТС] | 11 | |||||
SmallEvil, Всё таки там была утечка, я ее поправил. Мде, смарт поинтеры конечно притупили мне чутье xD
Алексей1153, не понял, как примерно должна выглядеть сигнатура? Просто я не понимаю зачем мне тут нужны variadic template's (если я правильно понял о чем Вы). Цель - это передать одно значение типа T и установить его дефолтным для всего массива. Сделать это на этапе компиляции нельзя, так как значение может быть не consteval
0
|
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||||
05.03.2021, 19:16 | 12 | |||||
Если в конструкторе T возникнет исключение, будет утечка памяти. Т.к. деструктор ~Array() не вызовется. А еcли бы даже вызвался, то отработает неправильно из-за m_size.
Добавлено через 4 минуты
2
|
05.03.2021, 19:16 | |
05.03.2021, 19:16 | |
Помогаю со студенческими работами здесь
12
Сдвиг по выделенной памяти С++ Удаление выделенной памяти Освобождение выделенной памяти Мусор в памяти, выделенной динамически Освобождение динамически выделенной памяти Корректно ли освобождение выделенной памяти? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |