Яка різниця між 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.