Использование memset на структурах в C ++ - PullRequest
6 голосов
/ 05 мая 2010

Привет, ребята. Я работаю над исправлением старого кода для моей работы. В настоящее время он написан на C ++. Они преобразовали статическое размещение в динамическое, но не редактировали memsets / memcmp / memcpy. Это моя первая стажировка по программированию, так что мне не хватает моего вопроса, похожего на новичка.

Следующий код написан на C, но я хочу, чтобы он был на C ++ (я читал, что malloc не является хорошей практикой в ​​C ++). У меня есть два сценария: во-первых, мы создали. Затем вы используете & F, чтобы заполнить с нуля. Второй указатель * pf. Я не уверен, как установить pf для всех 0, как в предыдущем примере в C ++.

Не могли бы вы просто сделать pf = new foo вместо malloc и затем вызвать memset(pf, 0, sizeof(foo))?

struct foo { ... } f;
memset( &f, 0, sizeof(f) );

//or

struct foo { ... } *pf;
pf = (struct foo*) malloc( sizeof(*pf) );
memset( pf, 0, sizeof(*pf) );

Ответы [ 4 ]

8 голосов
/ 05 мая 2010

Да, но только если foo является POD. Если у него есть виртуальные функции или что-то еще, удаленное C ++, не используйте memset на нем, так как это растопчет все внутренности структуры / класса.

То, что вы, вероятно, захотите сделать вместо memset, это дать foo конструктор для явной инициализации его членов.

Если вы хотите использовать новый, не забудьте соответствующее удаление. Еще лучше было бы использовать shared_ptr:)

3 голосов
/ 05 мая 2010

Можешь? Да, возможно. Тебе следует? Нет.

Хотя это, вероятно, сработает, вы теряете состояние, созданное для вас конструктором. В дополнение к этому, что произойдет, когда вы решите реализовать подкласс этой структуры? Тогда вы теряете преимущество повторно используемого кода, которое предлагает C ++ OOP.

Вместо этого вам следует создать конструктор, который инициализирует элементы для вас. Таким образом, когда вы позже создадите подкласс этой структуры, вы просто используете этот конструктор, чтобы помочь вам в создании подклассов. Это бесплатный, безопасный код! используйте это!

Редактировать: Предостережение в том, что если у вас уже есть огромная база кода, не меняйте ее, пока не начнете создавать подклассы структур. Он работает как сейчас.

2 голосов
/ 05 мая 2010

Вы можете новый foo (как это является стандартным способом в C ++) и реализовать конструктор, который инициализирует foo вместо использования memset .

1007 * Е.Г. *

struct Something
{
    Something()
        : m_nInt( 5 )
    {

    }

    int m_nInt;
};

Также не забывайте, если вы используете new для вызова delete , когда закончите работу с объектом, в противном случае вы получите утечки памяти.

2 голосов
/ 05 мая 2010

Да, это будет работать. Тем не менее, я не думаю, что malloc - это обязательно плохая практика, и я бы не стал ее менять, просто чтобы изменить. Конечно, вы должны убедиться, что вы всегда правильно сопоставляете механизмы выделения (new-> delete, malloc-> free и т.

Вы также можете добавить конструктор в структуру и использовать его для инициализации полей.

...