1 / 1 / 0
Регистрация: 19.10.2017
Сообщений: 60
|
||||||
1 | ||||||
Ошибка при использовании delete[] C++17.02.2019, 19:07. Показов 9097. Ответов 112
Метки нет (Все метки)
Здравствуйте. Я создал класс, где должен динамически выделить память, а потом в конце программы, с помощью деструктора, освободить выделений участок памяти. Проблема в том, что у меня почему то VS 2017 выдает ошибку (смотри скриншот) при использовании delete. Смотрел в Интернете, в других проблема появлялась, когда использовали delete вместо delete[] при удалении массива. Ранее подобной проблемы не было (хотя я тогда не использовав классы, вся программа была в main-e). Пожалуйста, помогите найти проблему.
0
|
17.02.2019, 19:07 | |
Ответы с готовыми решениями:
112
Ошибка при использовании delete Ошибка при использовании new[] / delete[] Ошибка при использовании оператора delete в Visual Studio 2010 Утечки памяти при использовании new/delete для двумерных массивов |
1659 / 488 / 106
Регистрация: 17.05.2015
Сообщений: 1,497
|
|
18.02.2019, 00:01 | 41 |
Я утверждаю, что после вызова delete,
либо по завершению области видимости имени автоматического объекта, вся занимаемая ими память может быть законным образом перераспределена. После уничтожения объекта он уже не может быть переиспользован. Нечего больше переиспользовать. Если вы считаете, что это очевидный бред, тогда вам, очевидно, нужно показаться психиатру. Если человек не предоставляет вам какую либо цитату из стандарта, это не значит, что он его не читал. К тому же, в моих тезисах нет места осуждению. Что бы это понимать нужно уметь думать. Попробуйте опровергнуть. Не поняла эту фразу. И?
0
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
18.02.2019, 00:08 | 42 |
rat0r,
Как то не получается согласиться... Когда вызван деструктор производного класса то производный считается просроченным, так? Но при этом деструктор базового класса ещё не вызван, и, соответственно для полей которые пришли из базового лайфтайм еще не завершился... объекты производного типа это контейнер и базовых полей. И что получается, для полей, которые находились в производном классе лайфтайм истёк, а для полей которые пришли из базового класса - нет, так как деструктор базового ещё не вызван. Но объект же у нас один. Как так получается, часть его полей просрочены а часть(которая пришла из базового) нет... Тоже не вяжется eva2326, Почему нельзя использовать? Вот, в деструкторе же пользуемся. И из других потоков вызываем данные и это вроде как не противоречит стандарту. По поводу примера с кодом где есть lock_guard - проблемы разные могут быть. Кода мало. Там просто два лока и все и как оно относится к обсуждаемому я не понял Сори, что не цитирую, с телефона не удобно
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
18.02.2019, 00:13 | 43 |
"Переиспользование" это вообще не к объекту, а к storage, который объект занимает (занимал).
Сообщение от https://timsong-cpp.github.io/cppwp/n4659/basic.life#1.4
"Уверен, в стандарте что-нибудь написано (что-нибудь такое, что опровергает)" Как это получается? Пока не вызовется их деструктор (если он нетривиальный), то их лайфтайм не истекает.
0
|
Неэпический
|
||||||
18.02.2019, 00:21 | 44 | |||||
То есть
foo так совпало, что new-expression создал объект по тому же адресу, что и при первом вызове foo , то мы имеем дело с тем же объектом, что и в первом вызове?А если конструктор делегирующий, то создается несколько новых объектов?
1
|
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
18.02.2019, 00:34 | 45 |
Объект - сущность, возникающая после завершения исполнения конструктора и прекращающая существование в момент начала исполнения деструктора.
В процессе обоих действий (конструктора/деструктора) для внешнего кода это будут "процессы в области памяти, выделенной под объект", но не действия с самим объектом.
0
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
18.02.2019, 00:45 | 46 |
rat0r,
Ну да, не истекает) Я об этом и говорю) Допустим есть базовый и производный класс В производном есть одно поле и ещё одно пришло от базового Эти оба поля являются полями обьекта производного класса Когда завершается лайфтайм экземпляра производного класса то он по идее является просроченным, так? Но тут проблема. Деструктор базового ещё не вызван. Поле, которое пришло из базового ещё не просрочено А объект сам просрочен Получается частичная просроченность т.к конструктор базового ещё не вызван
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
18.02.2019, 00:47 | 47 |
Undisputed, это просто обратный порядок к конструированию. Порядок конструирования тоже не кажется логичным?
0
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
18.02.2019, 08:11 | 48 |
rat0r,
Порядок конструирования вроде логичный. В деструкции выходит немного иначе Объект создан когда конструктор завершился Думаю было бы логичнее считать объект уничтоженным когда деструктор завершился В таком случае вопросов в отношении логики бы не было)
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
18.02.2019, 12:13 | 49 |
Тогда, как я уже говорил, порядок уничтожения не будет обратным к порядку создания.
0
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
||||||
18.02.2019, 12:44 | 50 | |||||
rat0r,
Не ради спора, просто хочу понять, почему? Вроде все будет. 1) отработает деструктор производного 2) отработает деструктор базового 3) lifetime завершен оба деструктора относятся к одному и тому же объекту несмотря на то что деструкторов здесь два (или может быть более), объект то у нас один речь именно о его lifetime деструкторы по сути такие же методы но вызываются неявно вот приведу такой пример (имитация вызова деструкторов):
0
|
Фрилансер
3709 / 2082 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
|
|
18.02.2019, 13:13 | 51 |
Ваше упорство совершенно непонятно. Согласитесь, что объект может оказаться частично разрушенным с самого начала работы деструктора.
2
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
18.02.2019, 13:25 | 52 |
Не по теме: Black Fregat, Суть в том что утверждается то что время жизни обьекта истекло, но при этом этим объектом можно пользоваться без противоречий стандарту. Разговор об этом идёт а не о том что какие то ресурсы могут быть освобождены явно и что кто то к ним может после этого обратиться. На эти же грабли можно наступить вообще без всяких деструкторов, в процедурном стиле.
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
18.02.2019, 13:29 | 53 |
Это не написано явно, поэтому я сначала удалил ответ.
Но в общем можно сказать что деструктор базового отрабатывает в конце деструктора производного, до выхода из него. Поэтому получается что деструктор базового заканчивает работу раньше, чем деструктор производного. И lifetime базового окончился бы раньше lifetime производного, если бы lifetime заканчивался в конце работы деструктора, а не в начале.
1
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
18.02.2019, 13:51 | 54 |
rat0r,
Да, согласен. Если рассуждать в контексте лайфтайма, правильнее было бы разместить вызов базового деструктора в деструкторе производного. Тем не менее, если перенести вызов базового деструктора в конец производного, с технической точки зрения все равно получим то же стандартный порядок разрушения Добавлено через 4 минуты Осталось выяснить что мешает здесь сказать что лайфтайм заканчивается после завершения деструктора?) Добавлено через 17 секунд Осталось выяснить что мешает здесь сказать что лайфтайм заканчивается после завершения деструктора?)
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
18.02.2019, 14:03 | 55 |
Undisputed, и что будет, если деструктор базового подобъекта или подобъекта-мембера бросит исключение? Считать его lifetime не законченным?
0
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
18.02.2019, 14:17 | 56 |
rat0r,
Почему нет? Для конструкторов же это так. Если исключение покидает конструктор, то лайфтайм обьекта не начинается (начинается если хотя бы 1 конструктор отработал полностью, это я про делегирующие конструкторы) Добавлено через 1 минуту При этом до исключения можно занять ресурсы а деструктор то не сработает
0
|
1659 / 488 / 106
Регистрация: 17.05.2015
Сообщений: 1,497
|
|||||||||||
24.02.2019, 16:54 | 57 | ||||||||||
Только с точки зрения высокоровневой логики))
С технической точки зрения это не так. Хорошее (полное) определение объекта даёт Страуструп: Если вам не нужно выполнять действия с памятью, то вам и конструктор тоже не нужен) С деструктором - аналогично. Добавлено через 6 минут Да. Вы мне скажите) Как это соотносится с вашей логикой. Для меня все просто: конструктор вообще ничего не конструирует. Правильнее было бы назвать его "инизиализатором". Добавлено через 8 минут Вы ошибаетесь )) Здесь захотелось сделать небольшую ремарку. Пример №1 Вот здесь имеет место быть один и тот же объект:
2. Тип объекта не изменился. Технически, объект изменил своё состояние, и не более того. Пример №2 Различные объекты:
это - различные объекты. Они различаются типами данных. Уже нельзя сказать, что "объект просто изменил своё состояние". Изменился сам "объект". Добавлено через 32 минуты Деструктор освобождает все захваченные ресурсы. Например класс строки. У него уже запустился деструктор. И он уже освободил память, которая когда то содержала буквоки. Вот как вы собираетесь пользоваться такой строкой? Считаете - это нормально? Использовать объект, если это приводит к проблемам? Что произойдёт, если один поток будет выводить боковки в консоль в тот самый момент, когда другой поток сделает delete ?
1
|
1659 / 488 / 106
Регистрация: 17.05.2015
Сообщений: 1,497
|
||||||
24.02.2019, 17:46 | 59 | |||||
Зачем вы постите одно и тоже?
Технически, говорить, что на старом месте новый объект - уместно, только если на старом месте теперь располагается объект другого типа. Вот тогда это будет действительно новый объект, а не тот же самый, которому просто гайки подкрутили:
0
|
Неэпический
|
|
24.02.2019, 18:05 | 60 |
Ясно. Когда Вы умрете, и по Вашему адресу будет жить другой человек - это будете Вы, просто с чуть подкрученными гайками.
0
|
24.02.2019, 18:05 | |
24.02.2019, 18:05 | |
Помогаю со студенческими работами здесь
60
Ошибка при delete[] Ошибка при вызове delete Ошибка при освобождении памяти (delete) Ошибка при работе delete в деструкторе Ошибка при Delete[] и удаление латинских букв Ошибка при удалении массива с помощью delete Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |