| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Как быстро обнулить объект? |
| Автор: Guest 14.9.2005, 10:25 |
| Всем привет! Когда-то читал книгу, где описывался пример то-ли какой-то библиотечной функции С, то-ли API-функции, в которую можно подставить любой объект (класс, структуру, int-ы всякие, хоть что) и быстро обнулить поля этого объекта. А теперь, хоть убей, не могу вспомнить название этой замечательной функции. Подскажите! |
| Автор: Dark Elf 14.9.2005, 10:52 | ||
Может быть
? |
| Автор: _hunter 14.9.2005, 10:54 |
| ZeroMemory() или FillMemory() |
| Автор: bilbobagginz 14.9.2005, 10:55 |
| memset() |
| Автор: chaos 14.9.2005, 11:26 | ||
или как нить так
|
| Автор: Dreamer_0x01 14.9.2005, 14:06 |
| угу. И шаблонами такую конструкцию обернуть и в функцию запихать ;) |
| Автор: Crait 14.9.2005, 14:55 |
| На Билдере, по крайней мере, всё это приводит к глюкам, если в классе имеются виртуальнае методы |
| Автор: _hunter 14.9.2005, 15:27 |
| угу. ты б еще память ядра обнулил. и удивлялся бы -- а почему все завернулось... |
| Автор: Crait 14.9.2005, 16:10 |
| _hunter, кому адресована твоя реплика ? |
| Автор: _hunter 14.9.2005, 16:14 |
| тебе |
| Автор: Crait 14.9.2005, 16:18 |
| Так с чего ты взял, что я удивляюсь ? |
| Автор: _hunter 14.9.2005, 16:47 |
| с последнего поста |
| Автор: Crait 14.9.2005, 16:59 |
| Я не удивляюсь, но предостерегаю (в отличие от других ответивших) от обнуления _всех_ данных класса. |
| Автор: Mayk 14.9.2005, 17:13 | ||||
В BSD есть еще ф-ция bzero. Некоторые компиляторы определяют её примерно как
Её не определяют не все виндозные компиляторы впрочем. Но вот в юнихах...
|
| Автор: JoyEx 14.9.2005, 17:40 | ||
для 1 класса попробуй так: ZeroMemory( (BYTE *)Destination + 4, sizeof(Класс) - 4); |
| Автор: Mayk 14.9.2005, 17:45 | ||
Дыкть, наследование может быть множественным. |
| Автор: _hunter 14.9.2005, 17:56 |
| и какой вообще смысл обнулять класс? лучше него это всеравно никто не сделает... |
| Автор: Crait 14.9.2005, 18:01 |
| Смысл как раз есть, и нередко |
| Автор: Дрон 14.9.2005, 18:03 | ||
Это противоречит ООП (щаз как Domestic Catа позову!! |
| Автор: Crait 14.9.2005, 18:05 | ||
Оно может и так, но бывает удобно |
| Автор: bilbobagginz 14.9.2005, 18:07 |
| кроме полей класса в классе есть ещё уйма ( для меня ) лишней информации (vptr ет цетера), к-рую memset затрёт полностью, и что не будет способствовать здоровью программы.. |
| Автор: Mayk 14.9.2005, 18:08 | ||||||
Неужели
удобнее
|
| Автор: Crait 14.9.2005, 18:12 |
| Это понятно, но тогда в reset() придётся обнулять все поля вручную, а при добавлении нового поля помнить, что следует модифицировать и reset(). В принципе, так и делаю |
| Автор: _hunter 14.9.2005, 18:53 |
| а в чем проблема помнить все поля? при чем их обычно пишут перед функциями -- так-что просто взглядом пробежаться на предмет есть/нету... + предположим я в конструкторе сделал VirtualAlloc(дофига памяти) и что будет после memset' a? |
| Автор: Crait 14.9.2005, 19:34 |
| Большой-то проблемы конечно же нет, но всё-же, одно дело - единожды написать что-нибудь типа memset(this,0,sizeof(*this)) и знать, что покрыто нулём будет абсолютно всё а другое - перечислять десяток операций по обнулению полей но, главное, помнить, что при изменениях в классе следует модифицировать также и метод reset(). Разумеется, никто, я думаю, не ожидает, что таким образом будет обнулена и динамически выделяемая память. |
| Автор: _hunter 15.9.2005, 11:02 |
| будут обнулены векторы, стринги... интересно... |
| Автор: Crait 15.9.2005, 11:59 |
| Заставь кой-кого Речь ведь в основном о POD-типах. |
| Автор: _hunter 15.9.2005, 12:11 | ||
дааа? не заметил речь шла о полях ( без указания типа... ) |
| Автор: Crait 15.9.2005, 12:31 |
| Нередко встречаются и такие типы полей, для которых термин "обнуление" вообще теряет смысл. А мы, я надеюсь, обсуждали не эти случаи. |