Яка різниця між new
/ delete
і malloc
/ free
?
Пов'язане (дублікат?): У яких випадках я використовую malloc vs new?
Яка різниця між new
/ delete
і malloc
/ free
?
Пов'язане (дублікат?): У яких випадках я використовую malloc vs new?
Відповіді:
Табличне порівняння особливостей:
Feature | new/delete | malloc/free
--------------------------+--------------------------------+-------------------------------
Memory allocated from | 'Free Store' | 'Heap'
Returns | Fully typed pointer | void*
On failure | Throws (never returns NULL) | Returns NULL
Required size | Calculated by compiler | Must be specified in bytes
Handling arrays | Has an explicit version | Requires manual calculations
Reallocating | Not handled intuitively | Simple (no copy constructor)
Call of reverse | Implementation defined | No
Low memory cases | Can add a new memory allocator | Not handled by user code
Overridable | Yes | No
Use of (con-)/destructor | Yes | No
Технічно пам’ять, виділена новим, надходить із "Безкоштовного магазину", тоді як пам'ять, виділена malloc, надходить із "Купи". Чи однакові ці дві області - це деталь реалізації, що є ще однією причиною того, що malloc та new не можна змішувати.
If ptr is NULL, no operation is performed.
new
Оператор виділяє пам'ять з безкоштовного магазину (також відомий як динамічна пам'ять і купа .) C ++ 14 Стандарту, розділ 3.7.4 на Dynamic Storage говорить «Об'єкти можуть створюватися динамічно під час виконання програми (1.9), використовуючи нові вирази (5.3.4), і знищуються з використанням ВИДАЛИТИ-вирази.»
Найбільш релевантна відмінність полягає в тому, що new
оператор виділяє пам'ять, потім викликає конструктор, і delete
викликає деструктор, а потім передає пам'ять.
new
називає ctor об'єкта, delete
викликає dtor.
malloc
& free
просто виділити і звільнити необроблену пам'ять.
new
/ delete
є С ++, malloc
/ free
походить від старого доброго С.
У C ++ new
викликає конструктор об'єктів і delete
викликає деструктор.
malloc
і free
, виходячи з темних століть перед ОО, лише виділяють і звільняють пам'ять, не виконуючи жодного коду об'єкта.
Єдина схожість полягає в тому, що malloc
/new
обидва повертають вказівник, який адресує деяку пам’ять на купі, і вони обидва гарантують, що після повернення такого блоку пам’яті він не повернеться знову, якщо спочатку не звільнити / видалити його. Тобто вони обоє «виділяють» пам’ять.
Однак new
/ delete
виконувати довільну іншу роботу, крім того, через конструктори, деструктори та перевантаження оператора. malloc
/free
тільки коли-небудь виділяють і вільну пам'ять.
Насправді new
є достатньо настроюваним, що не обов'язково повертає пам'ять із купи або взагалі виділяє пам'ять. Однак за замовчуванням new
.
Основна відмінність new і malloc полягає в тому, що новий викликає конструктор об'єкта і відповідний виклик для видалення викликає деструктор об'єкта.
Є й інші відмінності:
new
є безпечним для типу, malloc
повертає об'єкти типуvoid*
new
кидає виняток за помилку, malloc
повертає NULL
та встановлює errno
new
є оператором і може бути перевантажений, malloc
є функцією і не може бути перевантажений
new[]
, який виділяє масиви, більш інтуїтивно зрозумілий та безпечний, ніж тип malloc
malloc
-похідні асигнування можна змінити через realloc
, - new
отримані асигнування не можна змінити
malloc
може виділити N-байтовий фрагмент пам'яті, new
потрібно попросити виділити масив, скажімо, char
типів
Дивлячись на відмінності, підсумок malloc - це C-esque, новий - C ++ - esque. Використовуйте той, який вважається правильним для вашої кодової бази.
Хоча законно реалізовувати new та malloc за допомогою різних алгоритмів розподілу пам'яті, у більшості систем new внутрішньо реалізується за допомогою malloc, не даючи різниці на рівні системи.
Є кілька речей, що new
не malloc
робить:
new
будує об'єкт, викликаючи конструктор цього об'єктаnew
не вимагає набору даних виділеної пам'яті.Отже, якщо ви користуєтесь malloc
, то вам потрібно робити чітко вище речі, що не завжди практично. Крім того, new
можна перевантажувати, але malloc
бути не може.
Словом, якщо ви використовуєте C ++, постарайтеся використовувати new
якомога більше.
new
і delete
це примітиви C ++, які оголошують новий екземпляр класу або видаляють його (таким чином викликаючи деструктор класу для екземпляра).
malloc
і free
є функціями С і вони виділяють і вільні блоки пам'яті (за розміром).
Обидва використовують купу для виділення. malloc
і free
тим не менше, вони є "низьким рівнем", оскільки вони просто резервують шматок пам'яті, який, можливо, буде пов'язаний з покажчиком. Навколо цієї пам'яті не створюються структури (якщо ви не вважаєте, що масив C є структурою).
new і delete - це оператори в c ++; який теж може бути перевантажений. malloc і free функціонують в c;
malloc повертає null ptr, коли не вдається, а викиди нових кидків.
адресу, повернуту malloc, потрібно вводити заново, оскільки вона повертає (void *) malloc (size) Нове повернення введеного покажчика.
malloc()
, нам потрібно включити <stdlib.h>
або
<alloc.h>
в програму, яка не потрібнаnew
.new
і delete
може бути перевантажений, але malloc
не може.new
, ми можемо передати адресу, куди ми хочемо виділити пам'ять, але це неможливо у випадку malloc
.alloc.h
не є стандартним заголовком. <new>
потрібно використовувати нове розташування.
Цей код для використання ключового слова для видалення або вільної функції. Але при створенні об’єкта вказівника за допомогою 'malloc' або 'new' та оперативної пам'яті об'єкта за допомогою видалення навіть цей вказівник об'єкта може бути функцією виклику в класі. Після цього використовуйте безкоштовно замість видалення, тоді він також працює після вільного оператора, але при використанні обох тоді лише об’єкт вказівника не може викликати функціонування в класі .. код наступний:
#include<iostream>
using namespace std;
class ABC{
public: ABC(){
cout<<"Hello"<<endl;
}
void disp(){
cout<<"Hi\n";
}
};
int main(){
ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();
cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}
вихід:
Hello Hi 0x2abfef37cc20
1.новий синтекс простіший, ніж malloc ()
2.new/delete - оператор, де malloc () / free () є функцією.
3.new/delete виконується швидше, ніж malloc () / free (), оскільки новий код асамблеї безпосередньо вставляється компілятором.
4.Ми можемо змінити нове / видалити значення в програмі за допомогою оператора overlading.