Обнуление всех переменных класса

Всем привет.Допустим есть класс:
class Any {public:   int val1;   int val2;   char* str1;   char* str2;   ...   ...};
По стандартному их инициализировать можно так:
Any::Any() {   val1 = val2 = 0;   str1 = str2 = NULL;}
А возможно это сделать так?
Any::Any() {   memset(this, 0, sizeof(*this));}
Пробовал в Mingw и в gcc, работает. Интересны плюсы и минусы, и подводные камни.
9 ответов

такой способ затрёт vtable если она есть. соответственно вызов любой виртуальной ф-ции обрушит программуДобавлено @ 18:55
#include <cstring>class A{    public:    virtual ~A(){ }};int main(){    A *a = new A();    memset(a, 0, sizeof(A));    delete a; //вот тут деструктор вызывается и конец}22:55:dvl:~/src$ ./a.out Segmentation fault


Mayk, Помоему...Вы меня не поняли...Если сделать так как Вы приводите - Естественно!Я же обнуляю переменные в конструкторе.


Я же обнуляю переменные в конструкторе.
Всё равно это незаконно. Если уж так хочется обнулять поля memset-ом, можешь поместить их во вспомогательный POD-класс, объект которого потом сделать членом.


Если уж так хочется инициализировать поля memset-ом, можешь поместить их в базовый POD-класс. 
и проследить что помешенные в POD структуру поля тоже PODы .. (и еше всегда помнить что в эту структуру нельзя помешать не POD..  а понадобится через полгода внести изменения .. когда уже забыли каким способом Вы обнуляете поля и долго долго будете искать причину падения проги .. )


это кривые костыли, лучше так не делатьвообще есть такая вещь как наследование, о которой memset не знает, соответственно затретъ данные предка, которые к тому моменту уже проинициализированы. в общем это слишком чревато разными ошибками...например, если в классе есть члены-данные, которые имеют внутри себя указатели на данные и дефолтный конструктор... 
class Bar{    char * data;public:    Bar    {        data = new char[100];     }};class Foo1{    Bar bar;    public:    Foo1()    {        memset(this, 0, sizeof(*this));    }};class Foo2 : public Bar{    public:    Foo2()    {        memset(this, 0, sizeof(*this));    }};


Все, вопрос исчерпан.Всем спасибо.


А если будут виртуальные функции?   


А если будут виртуальные функции?  
это вообще жопакеды  


NiJazzLazinПарни. Ну вы что на самом деле думаете что я собрался таким образом обнулять классы с виртуальными функциями?  Блин...это только для структур, ненаследуемых!Хорошь прикалыватся