![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Валерия |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
Как вызвать деструктор тот что с тильдой, что бы полностью стереть obj1 и obj2 с памяти (obj3 - оставить) Тоесть полностью высвободить место которое занимают эти объекты. |
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
в вашем примере память освободится "сама", когда кончится время жизни объектов, если бы вы выделяли под них память динамически, то пришлось бы освобождать память вручную Это сообщение отредактировал(а) zkv - 16.4.2007, 23:40 |
|||
|
||||
| Валерия |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
А можете переделать мой пример, что бы память под value выделялась динамически, а потом высвобождалась?
Тоесть что бы вообще не было утечки |
|||
|
||||
| archimed7592 |
|
||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Добавлено через 1 минуту и 24 секунды
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
||||
|
|||||
| betal |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 26.12.2006 Репутация: нет Всего: 1 |
--------------------
101100010100001101100001110100101111011легкие деньги |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Валерия, У вас абсолютно все переменные в примере создаются в стеке, следовательно по достижению конца блока, в котором они были определены, деструктор для них вызывается автоматически.
|
|||
|
||||
| Annihilator |
|
|||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
Извинните, а почему в этом месте деструктор вызывается. Возможно я что-то подзабыл? Это сообщение отредактировал(а) Annihilator - 17.4.2007, 07:53 -------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Annihilator, заканчивается блок в которым они были объявлены.
|
|||
|
||||
| fantast |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.12.2006 Где: минск, столица на шей Родины Репутация: 2 Всего: 2 |
делай так
я такое делал когда выделял переменную по такому типу
в твоем случае это тоже сработает, можешь добавить в деструктор вывод какойнить строки и сам увидишь его запуск Это сообщение отредактировал(а) fantast - 17.4.2007, 13:31 --------------------
Эпитафия: Он старался. Неизвестный |
||||
|
|||||
| ama_kid |
|
||||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 2 Всего: 95 |
Как уже сказали, в данном примере и так не будет утечки... Но если есть необходимость просто понять суть - тогда вот переделанный пример:
Вызов деструктора у тебя будет виден благодаря надписи "deleted" -------------------- самурай без меча подобен самураю с мечом, но только без меча |
||||
|
|||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
НЕ ДЕЛАЙ ТАК! указатель, переданный delete должен быть получен с помощью new, иначе будут утечки(прога будет валиться и т.д. и т.п.) Валерия, если очень хочется явно вызвать деструктор, то можно написать obj1.~my (), но учти, что когда время жизни объекта закончится, деструктор вызовется ещё раз(!) и если в деструкторе освобождается память, то она будет освобождена дважды(!), что опять же утечки и т. п. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| fantast |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.12.2006 Где: минск, столица на шей Родины Репутация: 2 Всего: 2 |
ты уверен? 8) --------------------
Эпитафия: Он старался. Неизвестный |
|||
|
||||
| HappyLife |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 17.5.2006 Репутация: 3 Всего: 8 |
archimed7592,
какие я же могут быть утечки, если, удаление вызовется два раза? |
|||
|
||||
| _stranger_ |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 3.10.2006 Где: город-герой Киев Репутация: 2 Всего: 2 |
даже не утечки а UB. |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 8 Всего: 158 |
||||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
ну и я уверен
десткутор вызовется два раза, к чему это приведет зависит от каждого конкретного деструктора, но ясно, что делать так не надо! |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Компилятор такая штука, капризная, поэтому такие вещи лучше не делать
|
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Rockie |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
поэтому после очистки памяти указатель надо занулять.
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||
|
|||||
| archimed7592 |
|
||||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
как видишь - деалокация происходит дважды... т. о. в зависимости от реализации менеджера памяти могут быть и утечки и исключения и че душе угодно... так делать нельзя (!) Добавлено через 2 минуты и 35 секунд не лучшее решение как раз таки без занулённого указателя с включенным дебаг-менеджером памяти ругнётся и ошибку можно будет найти на этапе разработки... с занулённым - ругаться права не имеет... и ошибка выявится хз когда -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
||||||
|
|||||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
никогда не выявится, так как это не ошибка. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
с точки зрения IS - да, это не ошибка...
с архитектурной точки зрения - ещё какая -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
archimed7592, согласен. Указатель будет указывать на область памяти, где БЫЛ обьект. После уничтожения обьекта эта область может быть задействована под что-нибудь другое(к примеру системный процесс). И если повторно заюзать delete, то может случиться ОЙ. Применение же delete к зануленному указателю безопасно, поэтому если есть опасность повторного вызова delete, то указатель лучше занулять
Чем-то похожим вроде занимаются умные указатели.. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Согласна. Несмотря на то, что удалять нулевой указатель - не ошибка, зато ошибка - дважды вызывать деструктор. И ты не имеешь права надеяться, что в уже разрушенном объекте будет ноль на месте указателя - даже если в конкретном примере это получается именно так. Главное, абсолютно непонятно, ЗАЧЕМ вызывать деструктор руками? Если обязательно нужно что-то разрушить (освободить память) ДО выхода из функции - то можно а) заключить переменные в блок б) написать какой-нибудь Destroy, который и будет освобождать то, что нужно, и обнулять. -------------------- ... |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
дело больше не в том, что освобождается там память или нет, а в том, что, во-первых, если такое произошло - это уже очень плохое проектное решение(кроме редких случаев с отдельным коментарием - тех же smartpointers)...
во-вторых, в деструкторе может делаться что угодно и дважды его вызывать не нужно из тех же соображений, что и не нужно писать asm-вставки просто так, из тех же, что и не нужно писать myClass obj; delete &obj;, даже, если здесь и сейчас это работает... -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |