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

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

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

15 ответов


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

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

аналог

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

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

 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                            

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


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


new вызывает ctor объекта,delete вызовите dtor.

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


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

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


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

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

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


единственное сходство в том, что 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-esque, new-C++ - esque. Используйте тот, который подходит для вашей базы кода.

хотя законно, чтобы 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, нужно по типу, приведенному снова, поскольку он возвращает (void*)malloc (размер) New возвращает типизированный указатель.


  • new является оператором, тогда как malloc() является fucntion.
  • 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", и освобождает память объекта, используя удалить даже этот указатель объекта может быть функцией вызова в классе. После которые используют free вместо delete, а затем также работают после free statement , но при использовании обоих тогда только объект указателя не может вызывать функцию в классе.. код выглядит следующим образом :

#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.новый syntex проще, чем malloc()

2.new / delete-оператор, где malloc ()/бесплатно() это функция.

3.new / delete выполняется быстрее, чем malloc()/free (), потому что новый код сборки непосредственно вставляется компилятором.

4.мы можем изменить новое / удалить значение в программе с помощью оператора overlading.