C ++, Сброс членов класса без назначения каждого члена - PullRequest
1 голос
/ 21 января 2011

В простом C обычно происходит сброс структуры после создания экземпляра:

struct MyClass obj;
memset( &obj, 0, sizeof(struct MyClass) );

Это удобно - особенно при использовании объектно-ориентированной парадигмы, поскольку гарантируется сброс всех элементов на ноль и т. Д., Независимо от того, сколько членов добавлено со временем.

Я ищу способ сделать то же самое в C ++. Очевидно, вы не можете просто сбросить память, поскольку vtable является ее частью. Кроме того, в моем конкретном случае я не могу использовать шаблоны.

Я видел одно решение - объявить структуру с всеми членами, которые вы, в свою очередь, можете сбросить одним ударом:

class MyClass{

  MyClass(){ memset(&m, 0, sizeof(m)); }

  struct{
     int member;
  } m;
};

Однако я не очень люблю это решение.

Я полагаю, что доступны "хаки", и если вы их знаете, пожалуйста, также расскажите о рисках его использования, например, если это может отличаться между компиляторами и т. д.

Спасибо

Ответы [ 2 ]

2 голосов
/ 21 января 2011

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

size_t sz = sizeof(MyClass);
char *buf  = new char[sz];
memset(buf, 0, sz);
MyClass* instance = new (buf) MyClass;
0 голосов
/ 21 января 2011

Не для того, чтобы быть спойлером, но почему бы вам просто не добавить список инициализаторов для членов, которым требуется определенное значение для правильности объекта, и позволить компилятору найти идеальный способ инициализации объекта.1001 *

В зависимости от типа объекта, это может сэкономить значительное количество размера и / или времени кода, плюс это безопасно, даже если «пустое» представление для определенного типа не все нули.Например, я однажды взломал компилятор, что указатель NULL равен 0x02000000, и преобразовал между XOR целых и указателей с этим значением;Ваша программа затем инициализирует все члены-указатели ненулевыми значениями.

...