memset для инициализации в C ++ - PullRequest
16 голосов
/ 20 марта 2010

memset иногда используется для инициализации данных в конструкторе, как в примере ниже. Это работает в целом? Это хорошая идея в целом?

class A {
public:
   A();
private:
   int a;
   float f;
   char str[35];
   long *lp;
};

A::A()
{
   memset(this, 0, sizeof(*this));
}

Ответы [ 2 ]

22 голосов
/ 20 марта 2010

Не используйте memset. Это удержание от C и не будет работать на не POD. В частности, использование его в производном классе, который содержит любые виртуальные функции - или любой класс, содержащий не встроенные функции - приведет к катастрофе.

C ++ предоставляет специальный синтаксис для инициализации:

class A {
public:
   A();
private:
   int a;
   float f;
   char str[35];
   long *lp;
};

A::A()
    : a(0), f(0), str(), lp(NULL)
{
}

Если честно, я не уверен, но memset также может быть плохой идеей для чисел с плавающей запятой, поскольку их формат не указан.

12 голосов
/ 20 марта 2010

Это ужасная идея. Вы просто перебираете данные, не обращая внимания на то, как объекты должны быть инициализированы. Если ваш класс виртуальный, вы, вероятно, также уничтожите указатель 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 в качестве значения ловушки. Я уверен, что я не уверен, вступят ли здесь какие-либо другие источники неопределенного поведения.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...