Это ужасная идея. Вы просто перебираете данные, не обращая внимания на то, как объекты должны быть инициализированы. Если ваш класс виртуальный, вы, вероятно, также уничтожите указатель vtable.
memset
работает с необработанными данными, но C ++ не относится к необработанным данным. C ++ создает абстракции, поэтому, если вы хотите быть в безопасности, используйте эти абстракции. Используйте список инициализаторов для инициализации членов.
Вы можете сделать это для типов POD:
struct nothing_fancy_here
{
bool b;
int i;
void* p;
};
nothing_fancy_here x;
memset(&x, 0, sizeof(x));
Но если вы делаете это на this
, это означает, что вы находитесь в определяемом пользователем конструкторе и больше не квалифицируетесь как тип POD. (Хотя, если все ваши участники - POD, это может сработать, если ни один из них не содержит 0 в качестве значения ловушки. Я уверен, что я не уверен, вступят ли здесь какие-либо другие источники неопределенного поведения.)