Используя memset на структурах в C++

Эй парни. Я работаю над фиксацией более старого кода для моего задания. Это в настоящее время пишется в C++. Они преобразовали статическое выделение в динамический, но не отредактировали memsets/memcmp/memcpy. Это - моя первая стажировка программирования, таким образом пустая с моим подобным newbe вопросом.

Следующий код находится в C, но я хочу иметь его в C++ (я считал, что malloc не является хорошей практикой в C++). У меня есть два сценария: Во-первых, у нас есть созданный f. Затем Вы используете &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) );
6
задан garry 5 May 2010 в 14:09
поделиться

4 ответа

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

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

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

8
ответ дан 8 December 2019 в 15:59
поделиться

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

Например,

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

    }

    int m_nInt;
};

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

2
ответ дан 8 December 2019 в 15:59
поделиться

Можете ли вы? Да, вероятно. Должны ли вы? Нет.

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

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

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

3
ответ дан 8 December 2019 в 15:59
поделиться

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

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

2
ответ дан 8 December 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: