ни чем не опасно?
для класса, где все члены инициализирутся нулями,
было бы удобно и не так утомительно, как перечисление бесчисленных мемберов (с риском чего-то забыть).
А>memset(this,0,sizeof(*this)) в конструкторе А>ни чем не опасно?
Если класс полиморфный можешь этим потереть vptr.
Не рекомендую.
А>для класса, где все члены инициализирутся нулями, А>было бы удобно и не так утомительно, как перечисление бесчисленных мемберов (с риском чего-то забыть).
Может лучше пересмотреть реализацию класса?
Re[2]: memset(this,0,sizeof(*this)) в конструкторе
А>memset(this,0,sizeof(*this)) в конструкторе А>ни чем не опасно?
Безопасно только для POD-типов.
Причем даже для них этот код может делать не то, что ты от него ожидаешь.
Физическое заполнение нулями не обязано соответствовать логическому значению нуля для различных типов (особенно указателей, float и т.д.) А>для класса, где все члены инициализирутся нулями, А>было бы удобно и не так утомительно, как перечисление бесчисленных мемберов (с риском чего-то забыть).
Бесчисленные мемберы — это настораживает.
Кроме того, их можно завернуть в класс:
А>memset(this,0,sizeof(*this)) в конструкторе
А>ни чем не опасно? А>для класса, где все члены инициализирутся нулями, А>было бы удобно и не так утомительно, как перечисление бесчисленных мемберов (с риском чего-то забыть).
А если у тебя в классе будет член — объект некоего класса, для которого по умолчанию вызывается конструктор без параметров, он делает какие-нить свои хитрые инициализирующие действия, а ты потом забиваешь его память нулями — че тогда делать?
Удачи тебе, браток!
Re[3]: memset(this,0,sizeof(*this)) в конструкторе
А>memset(this,0,sizeof(*this)) в конструкторе
А>ни чем не опасно? А>для класса, где все члены инициализирутся нулями, А>было бы удобно и не так утомительно, как перечисление бесчисленных мемберов (с риском чего-то забыть).
В догонку — кроме того ты еще таким образом похеришь таблицу виртуальных методов.
Удачи тебе, браток!
Re[4]: memset(this,0,sizeof(*this)) в конструкторе
Здравствуйте, Глеб Алексеев, Вы писали:
ГА>Здравствуйте, srggal, Вы писали:
_>>>упадет класс с виртуальными методами.
S>>Я бы не был так категоричен:
ГА>Я не стал бы делать таких уточнений, т.к. здесь явный UB. Который, как известно, иногда выдает ожидаемые (автором кода) результаты.
В принципе согласен, а если this это POD ?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: memset(this,0,sizeof(*this)) в конструкторе
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Конструктор, в котором ты делаешь мемсет, автоматически делает тип не-ПОДом
Можно ссылку на стандарт, если не рудно ?
... << RSDN@Home 1.1.4 stable rev. 510>>
Простите за оффтоп, спеллчеккер есть ли какой нить встраивае
А>memset(this,0,sizeof(*this)) в конструкторе
А>ни чем не опасно? А>для класса, где все члены инициализирутся нулями, А>было бы удобно и не так утомительно, как перечисление бесчисленных мемберов (с риском чего-то забыть).
Для типов без
1) виртуального наследования,
2) без виртуальных функций,
3) без членов/баз, для которых опасна иницализация нулями после их конструктора
4) без, без членов/баз которые к которым эти правила 1,2,3 применяется рекурсивно,
это будет работать.
Лучше делать так. Обнулять память объекта перед вызовом конструктора, в которой лежит объект.
Для объектов в куче можно написать специальный перегруженный operator new.
_W>Лучше делать так. Обнулять память объекта перед вызовом конструктора, в которой лежит объект. _W>Для объектов в куче можно написать специальный перегруженный operator new.
_W>enum new_zero_t { new_zero }; _W>void *operator new(size_t size, new_zero_t) _W>{ _W> return memset(::operator new(size), 0, size); _W>}
_W>Это неудобно для объектов на стеке, но можно написать свою оболочку, вроде boost::optional.
А может проще не забыть перечислить все члены класса?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
А>memset(this,0,sizeof(*this)) в конструкторе
А>ни чем не опасно? А>для класса, где все члены инициализирутся нулями, А>было бы удобно и не так утомительно, как перечисление бесчисленных мемберов (с риском чего-то забыть).
На самом деле бывает ещё и смежная проблема -- когда надо писать читать все поля в файл.
Но при это мкласс не POD, могут быть какие-то непростые поля, скажем std::string или там функции виртуальные.
Это проблемы примерно одного сорта.
Самое хорошее решение, во всяком случае самое понятное, таки перечислять все поля.
Но если уж такое делать от чего-то совсем никак нельзя, то я пользуюсь таким трюком:
class MyClassPODData {
public:
PODType1 field1;
PODType2 field2;
// ...
PODTypeN fieldN;
};
class MyClass : public MyClassPODData {
// тут можно определять virtual функции, поля с конструкторами и прочие "неудобные" для хаккерства вещи
};
Ну а чтобы, например, заполнить нулями нашу POD-часть класса, делаем так:
memset( (public MyClassPODData*)this, 0, sizeof( public MyClassPODData ) );
Ну и с остальными операциями поступаем анологично.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
А>memset(this,0,sizeof(*this)) в конструкторе
А>ни чем не опасно? А>для класса, где все члены инициализирутся нулями, А>было бы удобно и не так утомительно, как перечисление бесчисленных мемберов (с риском чего-то забыть).
А завалить таблицу указателей на виртуальные функции?
Здравствуйте, <Аноним>, Вы писали:
А>memset(this,0,sizeof(*this)) в конструкторе
А>ни чем не опасно?
Для static const объектов получим GPF
А>для класса, где все члены инициализирутся нулями, А>было бы удобно и не так утомительно, как перечисление бесчисленных мемберов (с риском чего-то забыть).
ИМХО не так утомительно написать пару строчек, как просидеть пару суток в отладчике через пару месяцев .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
А>memset(this,0,sizeof(*this)) в конструкторе
А>ни чем не опасно? А>для класса, где все члены инициализирутся нулями, А>было бы удобно и не так утомительно, как перечисление бесчисленных мемберов (с риском чего-то забыть).
если членов класса много я пишу примерно так
class A
{
BYTE MemberAreaStart;
// here goes members
BYTE MemberAreaEnd;
public:
A();
};
A::A()
{
memset ( &MemberAreaStart, 0, &MemberAreaEnd - &MemberAreaStart);
}