Malloc функционируют в C++

Я перехожу к C++ от C. В C++, там какое-либо использование для функции malloc? Или я могу просто объявить это с "новым" ключевым словом. Например:

class Node
{
    ...
}
...
Node *node1 = malloc(sizeof(Node));        //malloc
Node *node2 = new Node;                    //new

Какой я должен использовать?

6
задан Mohit Deshpande 29 April 2010 в 21:36
поделиться

7 ответов

Использовать новый . Вам не нужно использовать malloc в программе на C ++, если только она не взаимодействует с некоторым кодом C или у вас нет причин для управления памятью особым образом.

Ваш пример node = malloc (sizeof (Node)) - плохая идея, потому что конструктор Node (если он существует) не будет вызываться, а последующий удалить узел; будет иметь неопределенные результаты.

Если вам нужен буфер байтов, а не объект, вы, как правило, захотите сделать что-то вроде этого:

char *buffer = new char[1024];

или, предпочтительно, что-то вроде этого:

std::vector<char> buffer(1024);

Обратите внимание, что для второго примера (используя std :: vector <> ), нет необходимости удалить объект; его память будет автоматически освобождена, когда он выйдет за пределы области видимости. Вы должны стремиться избегать как new , так и malloc в программах на C ++, вместо использования объектов, которые автоматически управляют своей собственной памятью.

21
ответ дан 8 December 2019 в 02:26
поделиться

Моя привычка - использовать malloc () для примитивных типов и структур, совместимых с C, и new для всего остального.

1
ответ дан 8 December 2019 в 02:26
поделиться

Прямым эквивалентом malloc () в C ++ является оператор new () , который также выделяет необработанную память, однако в большинстве случаев выражение new - это то, что вам нужно. Выражение new одновременно выделяет соответствующий объем необработанной памяти и инициализирует объект в этой области памяти, возвращая правильно типизированный указатель на новый объект.

В вашем случае новый узел правильный, поскольку он выделяет память и инициализирует новый объект узел . Простой вызов malloc и приведение результата к указателю на Node не приведет к правильному построению объекта Node . Это очень важно, если Узел не является структурой POD (например, когда он или один из его подобъектов имеет конструктор, который должен быть вызван).

Следует избегать динамического выделения памяти там, где это не нужно; там, где это необходимо, часто лучше всего инициализировать какой-нибудь интеллектуальный указатель адресом динамически выделяемого объекта, чтобы нельзя было «забыть» удалить объект.

9
ответ дан 8 December 2019 в 02:26
поделиться

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

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

Одно из основных различий между new и malloc заключается в том, что new вызывает конструктор объекта.

Другое отличие состоит в том, что new вызовет исключение (можно обойти с помощью прагмы компилятора ), если память не может быть успешно выделена. malloc может вызвать генерацию системного сигнала. Хотя некоторые библиотеки C ++ реализуют new путем вызова malloc .

Может быть несколько случаев, когда объекты необходимо динамически выделять без вызова их конструкторов. За более чем 20 лет я не встречал ни одного (даже на арене встраиваемых систем).

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

Основная ситуация, в которой вы должны использовать malloc - это если исходный код когда-либо вызывал realloc. Конечно, вы можете реализовать все необходимое заново, но в этом нет большого преимущества.

1
ответ дан 8 December 2019 в 02:26
поделиться

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

Ключевым моментом здесь является то, что то, что выделено с помощью new , должно быть освобождено с помощью delete , а то, что выделено с помощью malloc , должно быть освобождено с помощью бесплатно . Вы не можете выделить с помощью new и бесплатно с помощью free () или наоборот. Итак, примерно единственный раз, когда вам понадобится malloc , это когда вам нужно передать данные в некоторый код C, который может free () или realloc () it.

0
ответ дан 8 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

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