Я перехожу к C++ от C. В C++, там какое-либо использование для функции malloc? Или я могу просто объявить это с "новым" ключевым словом. Например:
class Node
{
...
}
...
Node *node1 = malloc(sizeof(Node)); //malloc
Node *node2 = new Node; //new
Какой я должен использовать?
Использовать новый
. Вам не нужно использовать malloc
в программе на C ++, если только она не взаимодействует с некоторым кодом C или у вас нет причин для управления памятью особым образом.
Ваш пример node = malloc (sizeof (Node))
- плохая идея, потому что конструктор Node
(если он существует) не будет вызываться, а последующий удалить узел;
будет иметь неопределенные результаты.
Если вам нужен буфер байтов, а не объект, вы, как правило, захотите сделать что-то вроде этого:
char *buffer = new char[1024];
или, предпочтительно, что-то вроде этого:
std::vector<char> buffer(1024);
Обратите внимание, что для второго примера (используя std :: vector <>
), нет необходимости удалить
объект; его память будет автоматически освобождена, когда он выйдет за пределы области видимости. Вы должны стремиться избегать как new
, так и malloc
в программах на C ++, вместо использования объектов, которые автоматически управляют своей собственной памятью.
Моя привычка - использовать malloc () для примитивных типов и структур, совместимых с C, и new для всего остального.
Прямым эквивалентом malloc ()
в C ++ является оператор new ()
, который также выделяет необработанную память, однако в большинстве случаев выражение new
- это то, что вам нужно. Выражение new
одновременно выделяет соответствующий объем необработанной памяти и инициализирует объект в этой области памяти, возвращая правильно типизированный указатель на новый объект.
В вашем случае новый узел
правильный, поскольку он выделяет память и инициализирует новый объект узел
. Простой вызов malloc
и приведение результата к указателю на Node
не приведет к правильному построению объекта Node
. Это очень важно, если Узел
не является структурой POD (например, когда он или один из его подобъектов имеет конструктор, который должен быть вызван).
Следует избегать динамического выделения памяти там, где это не нужно; там, где это необходимо, часто лучше всего инициализировать какой-нибудь интеллектуальный указатель адресом динамически выделяемого объекта, чтобы нельзя было «забыть» удалить
объект.
Что ж, единственное, что я могу придумать, - если вы используете new, вы пропустите перераспределение, если оно вам в конечном итоге понадобится.
Одно из основных различий между new
и malloc
заключается в том, что new
вызывает конструктор объекта.
Другое отличие состоит в том, что new
вызовет исключение (можно обойти с помощью прагмы компилятора
), если память не может быть успешно выделена. malloc
может вызвать генерацию системного сигнала. Хотя некоторые библиотеки C ++ реализуют new
путем вызова malloc
.
Может быть несколько случаев, когда объекты необходимо динамически выделять без вызова их конструкторов. За более чем 20 лет я не встречал ни одного (даже на арене встраиваемых систем).
Основная ситуация, в которой вы должны использовать malloc
- это если исходный код когда-либо вызывал realloc
. Конечно, вы можете реализовать все необходимое заново, но в этом нет большого преимущества.
Как правило, используйте новый
, кроме случаев взаимодействия с кодом C.
Ключевым моментом здесь является то, что то, что выделено с помощью new
, должно быть освобождено с помощью delete
, а то, что выделено с помощью malloc
, должно быть освобождено с помощью бесплатно
. Вы не можете выделить с помощью new
и бесплатно с помощью free ()
или наоборот. Итак, примерно единственный раз, когда вам понадобится malloc
, это когда вам нужно передать данные в некоторый код C, который может free ()
или realloc ()
it.