Рекомендуем, 2020

Выбор редакции

Разница между new и malloc ()

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

Сравнительная таблица

Основа для сравненияновыйmalloc ()
языкОператор new является специфической особенностью C ++, Java и C #.Функция malloc () является особенностью C.
Природа«новый» - это оператор.malloc () является функцией.
размер( )new не нуждается в операторе sizeof asit, выделяющем достаточно памяти для определенного типаmalloc требует, чтобы оператор sizeof знал, какой объем памяти он должен выделить.
КонструкторОператор new может вызывать конструктор объекта.malloc () не может вообще сделать вызов конструктору.
инициализацияОператор new может инициализировать объект, выделяя ему память.Инициализация памяти не может быть выполнена в malloc.
перегрузкаОператор new может быть перегружен.Malloc () никогда не может быть перегружен.
недостаточностьВ случае ошибки оператор new создает исключение.В случае сбоя malloc () возвращает NULL.
DeallocationРаспределение памяти по новым, освобождается с помощью «удалить».Выделение памяти с помощью malloc () освобождается с помощью функции free ().
перераспределениеНовый оператор не перераспределяет память.Память, выделенная функцией malloc (), может быть перераспределена с помощью realloc ().
выполнениеОператор new сокращает время выполнения.Malloc () требует больше времени для выполнения.

Определение нового

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

 тип имя_переменной = новый тип (список_параметров); 

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

Оператор new выделяет достаточно памяти, необходимой для объекта определенного типа. Следовательно, он не требует оператора sizeof () и не требует изменения размера памяти, например, malloc (), который использует realloc () для перераспределения памяти. Новый оператор является конструкцией; он вызывает конструктор объекта при объявлении, которое обычно используется для инициализации объекта.

Мы знаем, что новый оператор выделяет память в куче, а размер кучи ограничен. Таким образом, если куча не хватает памяти и новый оператор пытается выделить память, это приведет к сбою нового оператора. Если новый оператор не сможет выделить память, он выдаст исключение, и если ваш код не сможет обработать это исключение, программа будет аварийно завершена.

Память, выделенная оператором new, может быть освобождена с помощью оператора delete. Оператор new сокращает время выполнения, поскольку он является оператором, а не функцией.

Определение malloc ()

Malloc () - это функция, которая используется для выделения запрошенного объема памяти в куче. Метод возвращает указатель типа 'void', который далее является приведением типа, чтобы получить указатель на память указанного типа, и этот указатель на память назначается ссылочной переменной. Функция malloc () похожа на новый оператор в C ++, поскольку она используется для динамического выделения памяти. Malloc () является стандартной библиотечной функцией. Синтаксис функции malloc () следующий:

 type variable_name = (type *) malloc (sizeof (type)); 

Здесь «тип» указывает тип данных переменной, для которой должна быть выделена память. Имя_переменной - это имя ссылочной переменной, которой будет назначен указатель, возвращаемый функцией malloc (). Тип (type *) описывает приведение типов для получения указателя на память определенного типа. Sizeof () описывает malloc (), то, какой объем памяти требуется.

Для malloc () требуется приведение типа, поскольку указатель, возвращаемый функцией malloc (), имеет тип void, поэтому для присвоения указателю типа требуется приведение типа. Sizeof () требуется, потому что функция malloc () выделяет необработанную память, следовательно, она должна сообщить функции malloc (), какой объем памяти она должна выделить. Если выделенной памяти недостаточно, ее можно изменить или перераспределить с помощью realloc ().

Функция malloc () выделяет память в куче. В случае, если куче не хватает памяти, функция malloc () возвращает указатель NULL. Следовательно, ссылочная переменная, содержащая указатель, возвращаемый функцией malloc (), должна быть проверена перед использованием, в противном случае это может привести к сбою системы.

Память, выделенная функцией malloc (), освобождается с помощью free (). Поскольку вызов функции приводит к накладным расходам, malloc () требует больше времени для выполнения.

Ключевые различия между new и malloc ()

  1. Оператор new - это конструкция, введенная в C ++ и используемая в Java, C # и т. Д. С другой стороны, malloc () - это стандартная библиотечная функция, которая существует только на языке C и поддерживается C ++.
  2. Оператор new выделяет достаточно памяти для объекта указанного типа, поэтому ему не требуется оператор определения размера. С другой стороны, для функции malloc () требуется оператор sizeof (), чтобы она знала, какой объем памяти ей нужно выделить.
  3. Оператор new может вызывать конструктор объекта при объявлении. С другой стороны, функция malloc () не может вызвать конструктор.
  4. Оператор new может быть перегружен, а malloc () - нет.
  5. Если новый оператор не может выделить память, он генерирует исключение, которое должно быть обработано кодом, иначе программа завершит работу. С другой стороны, функция malloc () возвращает указатель NULL, если ей не удается выделить память. Если указатель используется без проверки этого, это приведет к сбою системы.
  6. Память, выделенная с помощью нового оператора, может быть освобождена с помощью «delete». С другой стороны, память, выделенная с помощью функции malloc (), может быть освобождена с помощью free ().
  7. Как только память выделена с помощью нового оператора, она не может быть изменена в любом случае. С другой стороны, память, выделенная с помощью функции malloc (), может быть перераспределена (изменена) с помощью функции realloc ().
  8. Время выполнения new меньше по сравнению с malloc (), потому что malloc - это функция, а new - это конструкция.

Заключение:

Функция malloc () - это старый способ динамического выделения памяти. В настоящее время новый оператор используется для выделения памяти во время выполнения, поскольку он имеет определенные преимущества по сравнению с malloc ().

Top