В чем разница между new/delete и malloc/free?



В чем разница между new/delete и malloc/free?



обзоры (дубликат?): В каких случаях я использую malloc vs new?

818   15  

15 ответов:

новый/удалить

  • выделить/освободить память
    1. память, выделенная из "свободного магазина"
    2. возвращает полностью типизированный указатель.
    3. new (стандартная версия) никогда не возвращает NULL (будет бросать при сбое)
    4. вызываются с типом-ID (компилятор вычисляет размер)
    5. имеет версию явно для обработки массивов.
    6. перераспределение (чтобы получить больше места) не обрабатывается интуитивно (из-за копирования конструктор.)
    7. ли они называют malloc / free определяется реализация.
    8. можно добавить новый распределитель памяти для работы с низкой памятью (set_new_handler)
    9. оператор new/delete может быть переопределен юридически
    10. конструктор / деструктор, используемый для инициализации / уничтожения объекта

malloc / free

  • выделение/освобождение памяти
    1. память выделяется из "Куча"
    2. возвращает void*
    3. возвращает NULL при сбое
    4. необходимо указать требуемый размер в байтах.
    5. выделение массива требует ручного вычисления пространства.
    6. перераспределение большего куска памяти просто (нет конструктора копирования, чтобы беспокоиться о)
    7. они не вызов new / delete
    8. нет способа объединить код пользователя в последовательность выделения, чтобы помочь с низкой памятью.
    9. malloc / free can не быть отменены юридически

таблица сравнения функций:

 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 не могут быть смешаны.

наиболее важным отличием является то, что new оператор выделяет память, вызывает конструктор, и delete вызывает деструктор, затем освобождает память.

new вызывается конструктор объекта, delete вызовите dtor.

malloc & free просто выделите и отпустите необработанную память.

В C++ new/delete вызовите конструктор / деструктор соответственно.

malloc/free просто выделить память из кучи. new/delete как выделить память.

new/delete Это C++,malloc/free происходит от старого доброго C.

В C++, new вызывает конструктор объектов и delete вызывает деструктор.

malloc и free, исходя из темных веков до OO, только Выделите и освободите память, не выполняя никакого кода объекта.

единственное сходство в том, что malloc/new оба возвращают указатель, который обращается к некоторой памяти в куче, и они оба гарантируют, что как только такой блок памяти будет возвращен, он не будет возвращен снова, если вы сначала не освободите/удалите его. То есть они оба "выделяют" память.

, new/delete выполнять произвольную другую работу дополнительно, через конструкторы, деструкторы и перегрузку оператора. malloc/free только когда-либо выделять и бесплатно память.

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

есть несколько вещей, которые new Это malloc нет:

  1. new создает объект, вызывая конструктор этого объекта
  2. new не требует типизации выделенной памяти.
  3. для этого не требуется выделять объем памяти, а требуется ряд объекты, которые будут построены.

если вы используете malloc, то вам нужно сделать выше вещи явно, что не является всегда практично. Кроме того, new может быть перегружен, но malloc не может быть.

одним словом, если вы используете c++, попробуйте использовать new как можно больше.

основное различие между new и malloc заключается в том, что new вызывает конструктор объекта, а соответствующий вызов delete вызывает деструктор объекта.

есть и другие отличия:

  • new является типобезопасным, malloc возвращает объекты типа void*

  • new выдает исключение при ошибке,malloc возвращает NULL и устанавливает errno

  • new - оператор и может быть перегружен, malloc является функцией и не может быть перегружен

  • new[], который выделяет массивы, является более интуитивным и типобезопасным, чем malloc

  • malloc - производные распределения могут быть изменены через realloc,new-производные распределения не могут быть изменены

  • malloc можно выделить N-байтовый кусок памяти,new необходимо попросить выделить массив, скажем,char типы

глядя на различия, краткая вызова malloc в C-стиле, новое в C++-стиле. Используйте тот, который подходит для вашей базы кода.

хотя законно, чтобы new и malloc были реализованы с использованием различных алгоритмов выделения памяти, в большинстве систем new внутренне реализуется с использованием malloc, не давая разницы на системном уровне.

и

глобальное новое и удаление может быть переопределено, malloc / free не может.

далее new и Delete можно переопределить для каждого типа.

new и delete в C++ примитивы которые объявляют новый экземпляр класса или удаляют его (таким образом вызывая деструктор класса для экземпляра).

malloc и free С функции и они выделяют и освобождают блоки памяти (по размеру).

оба используют кучу, чтобы сделать выделение. malloc и free тем не менее, более "низкий уровень", поскольку они просто резервируют кусок пространства памяти, который, вероятно, будет связан с указателем. Никакие структуры не создаются вокруг этой памяти (если вы не считаете массив C структурой).

new и delete-это операторы в c++; которые также могут быть перегружены. malloc и free являются функцией в c;

malloc возвращает null ptr при сбое во время нового исключения бросков.

адрес, возвращенный malloc нужно по типу casted снова, как он возвращает (void*)malloc (размер) Новая возвращать типизированный указатель.

  • new-это оператор, тогда как malloc () - это функция.
  • new возвращает точный тип данных, в то время как malloc() возвращает void * (указатель типа void).
  • malloc (), память не инициализируется и значение по умолчанию является мусором, тогда как в случае new память инициализируется значением по умолчанию, например, с "нулем (0)" в случае int.
  • delete и free() оба могут использоваться для указателей 'NULL'.
  • использовать malloc() нужно включить<stdlib.h> или <alloc.h> в программе, которая не требуется для new.
  • new и delete может быть перегружен, но malloc не может.
  • используя размещение new, мы можем передать адрес, где мы хотим выделить память, но это невозможно в случае malloc.

этот код для использования ключевого слова delete или свободной функции. Но когда создать объект указателя с помощью '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.

Comments

    Ничего не найдено.