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

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

следующий код на C, но я хочу иметь его на C++ (я читал, что malloc не является хорошей практикой на C++). У меня есть два сценария: во-первых, мы уже создали. Затем вы используете &f для заполнения нулем. Второй указатель *ПФ. Я не уверен, как установить 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 ответов


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

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

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


можно? Да, наверное. А должен? Нет.

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

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

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


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

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


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

Э. Г.

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

    }

    int m_nInt;
};

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