Рекомендуємо, 2022

Вибір Редакції

Різниця між новим і malloc ()

Нові та malloc () обидва використовуються для динамічного розподілу пам'яті. Хоча нові та malloc () різні в багатьох контекстах. Основною відмінністю між новим і malloc () є те, що new є оператором, що використовується як конструкт. З іншого боку, malloc () є стандартною функцією бібліотеки, яка використовується для виділення пам'яті під час виконання. Інші відмінності між ними розглядаються нижче на діаграмі порівняння:

Діаграма порівняння

Основа для порівнянняновийmalloc ()
МоваОператор new - це особлива особливість C ++, Java і C #.Функція malloc () є особливістю C.
Природа"new" - оператор.malloc () є функцією.
sizeof ()new не потребує розміру оператора, оскільки це достатньо для певного типуmalloc вимагає, щоб оператор sizeof знав, який розмір пам'яті він повинен виділити.
КонструкторОператор new може викликати конструктор об'єкта.malloc () не може взагалі здійснити виклик конструктору.
ІніціалізаціяОператор new може ініціалізувати об'єкт, виділяючи йому пам'ять.Ініціалізація пам'яті не може бути виконана в malloc.
ПеревантаженняОператор new може бути перевантажений.Malloc () ніколи не може бути перевантажений.
НевдачаНа відмову оператор new кидає виняток.При відмові, malloc () повертає NULL.
ВивізВиділення пам'яті новими, розмежоване за допомогою "delete".Виділення пам'яті за допомогою malloc () звільняється за допомогою функції free ().
ПерерозподілНовий оператор не перерозподіляє пам'ять.Пам'ять, що виділяється malloc (), може бути перерозподілена за допомогою realloc ().
ВиконанняОператор new скорочує час виконання.Malloc () вимагає більше часу для виконання.

Визначення нового

Оператор new - це оператор виділення пам'яті, який динамічно розподіляє пам'ять. Новий оператор виділяє пам'ять у купі і повертає початкову адресу цієї пам'яті, яка присвоєна опорній змінної. Новий оператор подібний до malloc () у C. Проте компілятор C ++ сумісний з malloc (), але краще використовувати новий оператор, оскільки він має певні переваги перед malloc (). Синтаксис нового оператора такий:

 тип variable_name = new type (параметр-список); 

Тут "type" позначає тип даних змінної, для якої пам'ять повинна бути виділена. Слово "variable_name" - це ім'я, яке задається посиланням, що містить покажчик на пам'ять. У дужках вказано виклик конструктора. Параметр list_list являє собою список значень, які передаються конструктору для ініціалізації новоствореного об'єкта.

Новий оператор виділяє достатньо пам'яті, необхідної для об'єкта певного типу. Отже, він не вимагає оператора sizeof () і не вимагає зміни розміру пам'яті, як malloc (), що використовує realloc () для перерозподілу пам'яті. Новий оператор - конструкт; він викликає конструктор об'єкта під час декларування, який зазвичай використовується для ініціалізації об'єкта.

Ми знаємо, що новий оператор виділяє пам'ять в купі і розмір купи обмежений. Отже, якщо в купі немає пам'яті і новий оператор намагається виділити пам'ять, це призведе до збою нового оператора. Якщо новий оператор не зможе виділити пам'ять, він викине виняток, і якщо ваш код не в змозі впоратися з цим винятком, програма закінчується ненормально.

Пам'ять, виділена оператором new, може бути звільнена за допомогою оператора delete. Новий оператор скорочує час виконання, оскільки він є оператором, а не функцією.

Визначення malloc ()

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

 тип variable_name = (тип *) malloc (sizeof (type)); 

Тут "type" вказує тип даних змінної, для якої повинна бути виділена пам'ять. Назва змінної - ім'я опорної змінної, до якої буде призначений покажчик, який повертається malloc (). (Type *) описує тип виведення для отримання покажчика на пам'ять конкретного типу. SizeOf () описує malloc (), що вимагає розмір пам'яті.

Malloc () вимагає відправлення типу, оскільки покажчик, який повертає malloc (), має тип void, тому для присвоєння типу покажчику потрібно приведення типу. SizeOf () є обов'язковим, оскільки функція malloc () виділяє необроблену пам'ять, тому потрібно вказати функцію malloc (), яку розмір пам'яті він повинен виділити. Якщо виділеної пам'яті недостатньо, її можна змінити або перерозподілити за допомогою realloc ().

Функція malloc () виділяє пам'ять на купі. У випадку, якщо купа не має пам'яті, то функція malloc () повертає покажчик NULL. Отже, посилання перемінної, що містить покажчик, що повертається malloc (), повинна бути перевірена, перш ніж вона буде використана, в іншому випадку це може призвести до збою системи.

Пам'ять, виділена функцією malloc (), звільняється за допомогою free (). Оскільки виклик функції призводить до накладних витрат, malloc () вимагає більше часу для виконання.

Ключові відмінності між новим і malloc ()

  1. Новий оператор - це конструкція, що вводиться в C ++ і використовується в Java, C # і т.д. З іншого боку, malloc () - це стандартна бібліотечна функція, знайдена тільки на мові C і підтримувана C ++.
  2. Новий оператор виділяє достатньо пам'яті для об'єкта зазначеного типу так, він не вимагає операції калібрування. З іншого боку, функція malloc () вимагає, щоб оператор sizeof () дозволив функції знати, який розмір пам'яті він повинен виділити.
  3. Новий оператор може викликати конструктор об'єкта під час декларування. З іншого боку, функція malloc () не може викликати конструктор.
  4. Оператор 'new' може бути перевантажений, але malloc () не може.
  5. Якщо новий оператор не може виділити пам'ять, він викидає виняток, який повинен бути оброблений кодом, який програма припинить. З іншого боку, функція malloc () повертає покажчик NULL, якщо він не може виділити пам'ять. Якщо покажчик використовується без перевірки цього, це призведе до збою системи.
  6. Пам'ять, виділена за допомогою нового оператора, може бути вилучена за допомогою 'delete'. З іншого боку, пам'ять, виділена за допомогою функції malloc (), може бути звільнена за допомогою free ().
  7. Після того, як пам'ять виділено за допомогою нового оператора, вона не може бути змінена. З іншого боку, пам'ять, виділена за допомогою функції malloc (), може бути перерозподілена (змінена) за допомогою функції realloc ().
  8. Час виконання нового є меншим у порівнянні з malloc (), оскільки malloc є функцією, а new - конструкцією.

Висновок:

Функція malloc () - це старий спосіб динамічного розміщення пам'яті. Сьогодні новий оператор використовується для виділення пам'яті під час виконання, оскільки він має певні переваги перед malloc ().

Top