Сравнителна таблица
Основа за сравнение | нов | malloc () |
---|---|---|
език | Операторът new е специфична характеристика на C ++, Java и C #. | Функцията malloc () е функция на C. |
природа | "new" е оператор. | malloc () е функция. |
размер на( ) | new не се нуждае от оператора sizeof, тъй като има достатъчно памет за определен тип | malloc изисква операторът sizeof да знае какъв размер на паметта трябва да разпредели. |
конструктор | Оператор new може да извика конструктора на обект. | malloc () изобщо не може да направи обаждане до конструктор. |
Инициализация | Операторът new може да инициализира даден обект, докато му разпределя памет. | Инициализирането на паметта не може да се извърши в malloc. |
Претоварването | Операторът new може да бъде претоварен. | Malloc () никога не може да бъде претоварен. |
неуспех | При неуспех операторът хвърля ново изключение. | При неуспех malloc () връща NULL. |
Deallocation | Разпределението на паметта по нов, освободено чрез "изтриване". | Разпределението на паметта от malloc () се освобождава, като се използва функция free (). |
Преразпределение | Новият оператор не преразпределя паметта. | Паметта, разпределена от malloc (), може да бъде преразпределена с помощта на realloc (). |
Екзекуция | Операторът new съкращава времето за изпълнение. | Malloc () изисква повече време за изпълнение. |
Дефиниция на нова
Операторът new е оператор за разпределение на паметта, който разпределя паметта динамично. Новият оператор разпределя паметта в купчината и връща началния адрес на тази памет, която е присвоена на референтна променлива. Новият оператор е подобен на malloc () в C. Въпреки това, C ++ компилаторът е съвместим с malloc (), но най-добре е да се използва нов оператор, тъй като има някои предимства пред malloc (). Синтаксисът на новия оператор е както следва:
напишете variable_name = new type (параметър-списък);
Тук "type" означава типа данни на променливата, за която паметта трябва да бъде разпределена. Думата "variable_name" е името, дадено на референтната променлива, която държи указателя към паметта. В скобите тук се посочва извикването на конструктора. Параметърът parameter_list е списъкът на стойностите, които се предават на конструктора за инициализиране на новоизградения обект.
Новият оператор разпределя достатъчно памет, необходима за обект от определен тип. Следователно, той не изисква оператор sizeof (), нито изисква промяна на размера на паметта като malloc (), която използва realloc (), за да преразпредели паметта. Новият оператор е конструкт; той извиква конструктор на обект, докато декларация, която обикновено се използва за инициализиране на обекта.
Знаем, че новият оператор разпределя паметта в купчината и размерът на купчината е ограничен. Така че, ако купчината е без памет и новият оператор се опитва да разпредели паметта, това ще доведе до отказ на новия оператор. Ако новият оператор не успее да разпредели паметта, той ще хвърли изключение и ако вашият код не може да се справи с това изключение, програмата се прекратява ненормално.
Паметта, отпусната от оператора new, може да бъде освободена чрез оператора delete. Новият оператор прекъсва времето за изпълнение, тъй като е оператор, а не функция.
Определение на malloc ()
Malloc () е функция, която се използва за разпределяне на исканото количество памет в купчината. Методът връща показалеца от тип 'void', който е по-нататък, тип cast, за да получи указател към памет от определен тип и този указател към паметта е присвоен на референтна променлива. Функцията malloc () е подобна на новия оператор в C ++, тъй като се използва за динамично разпределение на паметта. Malloc () е стандартна библиотечна функция. Синтаксисът на функцията malloc () е както следва:
тип variable_name = (тип *) malloc (sizeof (type));
Тук “type” указва типа данни на променливата, за която трябва да бъде разпределена памет. Името на променливата е името на референтната променлива, към която ще бъде присвоен показалецът, върнат от malloc (). (Тип *) описва типа кастинг за получаване на показалец към паметта в определен тип. Sizeof () описва malloc (), какъв размер на паметта е необходим.
Malloc () изисква кастинг, тъй като указателят, върнат от malloc (), е с тип void, така че за да се присвои тип на показалеца, е необходимо въвеждане на тип. Sizeof () е задължително, тъй като функцията malloc () разпределя сурова памет, следователно е необходимо да се каже функцията malloc (), за какъв размер на паметта трябва да се разпредели. Ако разпределената памет не е достатъчна, тя може да бъде преоразмерена или преразпределена с помощта на realloc ().
Функцията malloc () разпределя паметта в купчината. В случай, че купчината няма памет, функцията malloc () връща NULL указател. Следователно референтната променлива, съдържаща указател, върнат от malloc (), трябва да се провери, преди да се използва, в противен случай може да доведе до срив на системата.
Паметта, отделена от функцията malloc (), се освобождава, използвайки free (). Тъй като извикването на функцията води до натоварване, malloc () изисква повече време за изпълнение.
Ключови разлики между нови и малки ()
- Новият оператор е конструкт, въведен в C ++ и използван в Java, C # и др. От друга страна, malloc () е стандартна библиотечна функция, намираща се само на C език и поддържана от C ++.
- Новият оператор разпределя достатъчно памет за обекта от определен тип, така че не изисква оператор за оразмеряване. От друга страна, функцията malloc () изисква операторът sizeof () да позволи на функцията да знае, че какъв размер на паметта трябва да разпредели.
- Новият оператор може да извика конструктора на обекта докато декларира. От друга страна, функцията malloc () не може да извика конструктора.
- Операторът „new“ може да бъде претоварен, но malloc () не можа.
- Ако новият оператор не успее да разпредели паметта, той изхвърля изключение, което трябва да бъде обработено от кода, който програмата ще прекрати. От друга страна, функцията malloc () връща NULL указател, ако не успее да разпредели паметта. Ако показалеца се използва, без да проверява това, това ще доведе до срив на системата.
- Паметта, отпусната с нов оператор, може да бъде освободена чрез използване на „изтриване“. От друга страна, паметта, разпределена чрез функцията malloc (), може да бъде освободена, използвайки free ().
- След като паметта бъде разпределена с нов оператор, тя не може да бъде преоразмерена. От друга страна, паметта, разпределена чрез функцията malloc (), може да се преразпредели (преоразмерява) с помощта на функцията realloc ().
- Времето за изпълнение на новото е по-малко в сравнение с malloc (), тъй като malloc е функция и new е конструкт.
Заключение:
Функцията malloc () е стария начин за динамично разпределяне на паметта. Днес новият оператор се използва за разпределяне на паметта по време на изпълнение, тъй като има някои предимства пред malloc ().