Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как быстро обнулить объект?


Автор: Guest 14.9.2005, 10:25
Всем привет!
Когда-то читал книгу, где описывался пример то-ли какой-то библиотечной функции С, то-ли API-функции, в которую можно подставить любой объект (класс, структуру, int-ы всякие, хоть что) и быстро обнулить поля этого объекта. А теперь, хоть убей, не могу вспомнить название этой замечательной функции. Подскажите!

Автор: Dark Elf 14.9.2005, 10:52
Может быть
Код

void ZeroMemory(
  PVOID Destination,
  SIZE_T Length
);

?

Автор: _hunter 14.9.2005, 10:54
ZeroMemory() или FillMemory()

Автор: bilbobagginz 14.9.2005, 10:55
memset()

Автор: chaos 14.9.2005, 11:26
или как нить так smile
Код

for (BYTE *pFree = pObj, int i = 0; i < sizeof(*pObj); pFree[i] = 0, i++);

Автор: Dreamer_0x01 14.9.2005, 14:06
угу. И шаблонами такую конструкцию обернуть и в функцию запихать ;)

Автор: Crait 14.9.2005, 14:55
На Билдере, по крайней мере, всё это приводит к глюкам,
если в классе имеются виртуальнае методы smile

Автор: _hunter 14.9.2005, 15:27
угу. ты б еще память ядра обнулил. и удивлялся бы -- а почему все завернулось...

Автор: Crait 14.9.2005, 16:10
_hunter, кому адресована твоя реплика ?

Автор: _hunter 14.9.2005, 16:14
тебе smile

Автор: Crait 14.9.2005, 16:18
Так с чего ты взял, что я удивляюсь ?

Автор: _hunter 14.9.2005, 16:47
с последнего поста smile ( того, на который я ответил )

Автор: Crait 14.9.2005, 16:59
Я не удивляюсь, но предостерегаю (в отличие от других ответивших)
от обнуления _всех_ данных класса.

Автор: Mayk 14.9.2005, 17:13
В BSD есть еще ф-ция bzero. Некоторые компиляторы определяют её примерно как
Код

#define bzero(ptr, sz) (memset((ptr),0,(sz)))

Её не определяют не все виндозные компиляторы впрочем. Но вот в юнихах...

Цитата(SergeCpp @ 14.9.2005, 16:09)
STOSD

smile Тогда уж x ^= x;

Автор: JoyEx 14.9.2005, 17:40
Цитата(Crait @ 14.9.2005, 14:55)
На Билдере, по крайней мере, всё это приводит к глюкам,
если в классе имеются виртуальнае методы 


для 1 класса попробуй так:

ZeroMemory( (BYTE *)Destination + 4, sizeof(Класс) - 4);

Автор: Mayk 14.9.2005, 17:45
Цитата(JoyEx @ 14.9.2005, 21:40)
ZeroMemory( (BYTE *)Destination + 4, sizeof(Класс) - 4);

Дыкть, наследование может быть множественным.

Автор: _hunter 14.9.2005, 17:56
и какой вообще смысл обнулять класс? лучше него это всеравно никто не сделает...

Автор: Crait 14.9.2005, 18:01
Смысл как раз есть, и нередко smile

Автор: Дрон 14.9.2005, 18:03
Цитата(Crait @ 14.9.2005, 19:01)
Смысл как раз есть, и нередко smile

Это противоречит ООП (щаз как Domestic Catа позову!! smile ).

Автор: Crait 14.9.2005, 18:05
Цитата
Это противоречит ООП

Оно может и так, но бывает удобно smile

Автор: bilbobagginz 14.9.2005, 18:07
кроме полей класса в классе есть ещё уйма ( для меня ) лишней информации (vptr ет цетера), к-рую memset затрёт полностью, и что не будет способствовать здоровью программы..

Автор: Mayk 14.9.2005, 18:08
Цитата(Crait @ 14.9.2005, 22:05)
Оно может и так, но бывает удобно

Неужели
Код

classs->~Class()
bzero(classs, sizeof(*classs))

удобнее
Код

classs->reset();

smile

Автор: Crait 14.9.2005, 18:12
Это понятно, но тогда в reset() придётся обнулять все поля вручную,
а при добавлении нового поля помнить, что следует модифицировать
и reset().
В принципе, так и делаю smile

Автор: _hunter 14.9.2005, 18:53
а в чем проблема помнить все поля? при чем их обычно пишут перед функциями -- так-что просто взглядом пробежаться на предмет есть/нету...

+ предположим я в конструкторе сделал VirtualAlloc(дофига памяти)
и что будет после memset' a?

Автор: Crait 14.9.2005, 19:34
Большой-то проблемы конечно же нет, но всё-же, одно дело
- единожды написать что-нибудь типа memset(this,0,sizeof(*this))
и знать, что покрыто нулём будет абсолютно всё smile,
а другое - перечислять десяток операций по обнулению полей
но, главное, помнить, что при изменениях в классе
следует модифицировать также и метод reset().

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

Автор: _hunter 15.9.2005, 11:02
будут обнулены векторы, стринги... интересно...

Автор: Crait 15.9.2005, 11:59
Заставь кой-кого smile Богу молиться, так он себе лоб расшибёт...
Речь ведь в основном о POD-типах.

Автор: _hunter 15.9.2005, 12:11
Цитата
Речь ведь в основном о POD-типах.

дааа? не заметил smile
речь шла о полях ( без указания типа... )

Автор: Crait 15.9.2005, 12:31
Нередко встречаются и такие типы полей, для которых
термин "обнуление" вообще теряет смысл.
А мы, я надеюсь, обсуждали не эти случаи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)