Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 04-09-2008 04:25 » |
|
туплю, пните, где не прав (
насколько я понял из издевательств над объектами в отладчике, неважно под какой объект была выделена память при помощи new , даже если указатель привести к (void*) , а потом delete его (речь не про массив, а про один объект) , то память возвращается вся (но, естественно, деструктор не будет вызван - это понятно)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 04-09-2008 04:27 » |
|
то есть, если выделена память под DWORD dwd, а удалим как delete (BYTE*)&dwd то все 4 байта вернутся в кучу, а не 1 только ?
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #2 : 04-09-2008 05:41 » |
|
Алексей1153++, Вопрос касается только про дебаг моду или и про релиз? Просто что касается дебага, то тут что компилятор хочет то и делает, а вот про Релиз точно ответить не могу - не знаю. Но помоему вроде в релизе должны быть проблемы.
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 04-09-2008 05:44 » |
|
ну то есть лучше всё таки сделать виртуальный метод и в производном классе чётко самого себя удалить этим методом ? (через указатель родителя)
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #4 : 04-09-2008 06:08 » |
|
Алексей1153++, виртуальный деструктор должен быть ВСЕГДА, но если ты его укажешь, только в родителе ничего страшного, будет дефолтовый виртуальный деструктор, который позовёт все деструкторы членов потомка.
|
|
|
Записан
|
Странно всё это....
|
|
|
McZim
|
|
« Ответ #5 : 04-09-2008 06:08 » |
|
хм, тоже туплю: а точно такая конструкция сработает? delete (BYTE*)&dwd если сработает, то мне кааца, что на (BYTE*) будет наплевать.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 04-09-2008 06:10 » |
|
LogRus, яне про деструктор говорю (он и так есть, и так виртуальный). А про виртуальный метод, в котором сделается delete this )
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 04-09-2008 06:11 » |
|
McZim, даже (void*) прокатило )
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #8 : 04-09-2008 07:28 » |
|
Алексей1153++, эх Алексей, руки бы тебе оторвать за такие извращения (^_^)
нафига тебе это нужно?
|
|
|
Записан
|
Странно всё это....
|
|
|
sss
Специалист
Offline
|
|
« Ответ #9 : 04-09-2008 08:19 » |
|
Алексей1153++, в конечном итоге работа delete сводится в любом случае к вызову одной из функций (в случае Windows) HeapFree, LocalFree, GlobalFree, которым абсолютно наплевать на тип блока памяти.
|
|
|
Записан
|
while (8==8)
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #10 : 04-09-2008 09:52 » |
|
sss, речь идет о размере, а не о типе. Понятное дело что delete что-то освободит, вопрос что именно (ну а конкретнее сколько). Ну это при условии что я правильно понял Леху...)))
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #11 : 04-09-2008 10:30 » |
|
lapulya, но при вызове free в обычном C ты указываешь размер?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
McZim
|
|
« Ответ #12 : 04-09-2008 10:41 » |
|
dimka, насколько я понял:
MATRIX* mat;
free((char*)mat->data) free(mat->data)
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #13 : 04-09-2008 11:33 » |
|
Ребят, при освобождении передаётся хендл на блок памяти. То что Лёшка написал это просто кастинг при обращении к этому блоку памяти, для удаления это не имеет значения.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
McZim
|
|
« Ответ #14 : 04-09-2008 11:41 » |
|
Джон, я так понял, как раз интересует Леху, пи кастинге сколько будет освобождено памяти? Опять так и если я правильно понял.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #15 : 04-09-2008 11:46 » |
|
Макс, кастинг это оператор. Те имеет значение возвращаемое значение. А для оператора dlete важно, что параметр - указатель, поэтому это работает и при void* и кастинг здесь не делает никакой погоды.
Согласен с LogRus.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
McZim
|
|
« Ответ #16 : 04-09-2008 11:49 » |
|
Джон, ну так все таки, сколько будет в граммах
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #17 : 04-09-2008 11:58 » |
|
Ровно столько сколько было выделено. С точностью до байта.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
McZim
|
|
« Ответ #18 : 04-09-2008 12:02 » |
|
значит, вот тут я был прав.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #19 : 04-09-2008 13:32 » |
|
А кто тебе сказал, что ты там не прав? Лёшка же тебе даже сказал, что даже void* прокатит.
зы При условии конечно (как и в твоём вторм примере), что указатели будут правильно проинициаллизированы.
|
|
« Последнее редактирование: 04-09-2008 13:34 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
RXL
|
|
« Ответ #20 : 04-09-2008 13:47 » |
|
А вызов деструктора в случае приведения к void* разве сработает?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #21 : 04-09-2008 13:59 » |
|
Джон, я не про то что даже void* сработает, а про то что: если сработает, то мне кааца, что на (BYTE*) будет наплевать.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 04-09-2008 14:19 » |
|
деструктора - не сработает. Но это отдельная задача , я просто принцип спрашиваю же, то есть что delete освободит память в любом раскладе. А дальше я уже соображу Алексей1153++, эх Алексей, руки бы тебе оторвать за такие извращения (^_^) нафига тебе это нужно?
уже ответил строчкой выше
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #23 : 04-09-2008 21:56 » |
|
В методе класса можно вызывать delete this; без каких либо последствий. Самое главное, чтобы после данного вызова не было обрашений к не статическим переменным и другим методам данного класса. Т.е. в идеальном случае, после вызова удаления класса, нужно сразу выходить из метода.
Если где то делать кастинг указателя класса скажем на void *, и затем удалять, то проблемы возникнут с течью памяти, если в данном классе переменные были созданы динамически.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Антон (LogRus)
|
|
« Ответ #24 : 05-09-2008 03:05 » |
|
Нет, ну вот зачем? Зачем? Что, млин за грязные хаки?
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #25 : 05-09-2008 05:31 » |
|
Finch, так и сделал, вызывается "родной" delete через виртуальную процедуру, а далее считается, что объекта нет ЛогРус, расслабься ) Просто вникаю в суть, это нигде в таком виде не будет использовано. В любом случае, я не боюсь указателей
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #26 : 05-09-2008 05:40 » |
|
Алексей1153++, да я не напрягаюсь и указателей кстати тоже не боюсь я их просто не люблю
|
|
|
Записан
|
Странно всё это....
|
|
|
Malaja
|
|
« Ответ #27 : 05-09-2008 06:51 » |
|
Finch, ой, "а вот с этого места, пожалуйста, поподробней" (С), т.е. теперь для меня тупой еще раз и помедленней: зачем тебе в самом классе в одном из его методов вызывать delete this? Какой смысл? "Где деньги, Зин?" (С) Для чего это может использоваться? Если объект класса был создан кем-то, то он тем самым кем-то должен быть и убран, дабы не путаться. Ну а в обычной жизни для объекта класса при его умирании и так будет вызван деструктор, который все почистит.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #28 : 05-09-2008 07:02 » |
|
Ирин, речь про вот что: struct A { virtual void deleteThis()=0; };
struct B:A { ... void deleteThis() { delete this; } };
struct C:A { ... void deleteThis() { delete this; } };
//-------------
A* pVirt=0;
if(условие) { pVirt=new B; } else { pVirt=new C; }
...
//как удалять будем ?
//так delete pVirt; pVirt=0;
//или так pVirt->deleteThis(); pVirt=0;
придерживаюсь второго варианта всё же . Там и деструкторы правильно вызовутся
|
|
« Последнее редактирование: 05-09-2008 07:04 от Алексей1153++ »
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #29 : 05-09-2008 07:06 » |
|
Malaja, например в методе Release() объекта с подсчетом ссылок. u_long __stdcall CLifeControlObject::Release(void) { long lRC = ::InterlockedDecrement((long *) &m_ulRefCount); if ( lRC == 0) { delete this; return 0; } #ifdef _DEBUG if ( lRC < 0) { SHOWTHROW( TEXT("Вызов Release() без AddRef()"), ClassName); } #endif return lRC; }
|
|
|
Записан
|
while (8==8)
|
|
|
|