Unterschied zwischen malloc und operator new (malloc vs new)

Unterschied zwischen malloc und operator new (malloc vs new)

In diesem Tutorial lernen Sie den Unterschied zwischen malloc() und dem Operator new (malloc vs new) kennen. Sowohl new als auch malloc() werden für die dynamische Speicherallokation verwendet. Aber sie unterscheiden sich voneinander.

Der Hauptunterschied zwischen new und malloc besteht darin, dass new ein Operator ist und einen typsicheren Zeiger auf einen initialisierten Speicherblock zurückgibt, während malloc eine Standardbibliotheksfunktion ist, die einen void-Zeiger (nicht typsicher) auf einen nicht initialisierten Speicherblock zurückgibt. Sehen wir uns einige Unterschiede zwischen malloc und new an.

Im Folgenden sind die Unterschiede zwischen malloc() und dem Operator new (malloc vs. new) aufgeführt:

1. Konstruktoren:

Der Klassenkonstruktor wird vom new-Operator aufgerufen, aber nicht vom malloc. Sie können auch die primitiven Datentypen (char, int, float usw.) mit dem Initialisierer des neuen Ausdrucks initialisieren. Siehe die folgenden Beispiele.

Example 1:

Im folgenden Beispiel wird ein Klassenobjekt mit dem neuen Ausdruck erstellt und mit dem delete-Ausdruck zerstört. Ich habe die Nachricht in Konstruktor und Destruktor ausgegeben, Sie können die Ausgabe sehen.

#include <iostream>
using namespace std;

class Animal
{
public:
    unsigned int m_uiSpeed;
    Animal();
    ~Animal();
};

// constructor
Animal::Animal()
{
    cout<<"\nCreating Object\n";
}

// destructor
Animal::~Animal()
{
    cout<<"\nDeleting Object\n";
}

int main()
{
    //Creating object using new operator
    Animal *cat = new Animal();
    delete cat;

    return 0;
}

Ausgabe:

Example 2:

Im folgenden Beispiel weisen wir mit Hilfe des new-Operators den Speicher für die Ganzzahl zu und initialisieren den zugewiesenen Speicher.

#include<iostream>
using namespace std;

int main()
{
    // Initialization with new()
    int *ptr = new int(27);

    cout << *ptr << endl;

    delete ptr;

    return 0;
}

Ausgabe:27

2. Funktion vs. Operator:

malloc() ist eine Bibliotheksfunktion, die eine Anzahl (von Bytes) als Argument nimmt und ein void* zurückgibt, das auf einen nicht initialisierten Speicher zeigt.

Syntax von malloc:

//Syntax of malloc function

void *malloc(size_t size);


where, size is number of bytes to allocate

Example,

Im folgenden Beispiel können Sie sehen, dass ich den void * to int* explizit typisiert habe . Wenn ich es nicht mache, bekomme ich den Compiler-Fehler „Fehler:Ungültige Konvertierung von ‚void*‘ nach ‚int*‘“. Manchmal ist die explizite Typumwandlung gefährlich und wird zur Quelle versteckter Fehler.

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    // allocate memory of int size to an int pointer
    // Also explicitly need to typecast
    int* ptr = (int*) malloc(sizeof(int));

    // assign the value 5 to allocated memory
    *ptr = 5;

    cout << *ptr;

    free(ptr);

    return 0;
}

Der new ist ein Operator, der einen Typ und eine Reihe von Initialisierern (optional) für diesen Typ als Argumente nimmt und einen Zeiger auf ein (optional) initialisiertes Objekt seines Typs zurückgibt.

Example,

Sie können das folgende Beispiel sehen, in dem wir Speicher für die Ganzzahl zugewiesen haben und den Zeiger nicht explizit typisieren müssen.

#include <iostream>
using namespace std;

int main()
{
    // allocate memory and explicit typecast not require
    int *ptr = new int;

    // assign the value 5 to allocated memory
    *ptr = 5;

    cout << *ptr;

    delete ptr;

    return 0;
}

3. Geben Sie Sicherheit ein:

malloc() gibt ein void* zurück was nicht typsicher ist. new T gibt einen Zeiger auf T zurück. Sie können die obigen Beispiele überprüfen, die ich bereits erklärt habe.

4. Bei Fehler:

Bei einem Fehler gibt malloc() NULL zurück, während new die Ausnahme bad_alloc auslöst. Wenn Sie nothrow verwenden , new gibt bei einem Fehler einen Nullzeiger zurück.

Example,

// throws bad_alloc if it fails
T* p1 = new T; 


// returns nullptr if it fails
T* p2 = new(nothrow) T;

5. Erforderliche Größe:

Die benötigte Speichergröße wird für new vom Compiler berechnet, während wir die Größe für malloc() manuell berechnen müssen.

Example,

// allocate memory using new and 
// does not need to calculate the size of int
int *ptr1 = new int;


// allocate memory using malloc() and 
// need to calculate the size of int using the sizeof
int *ptr2 = (int*)malloc(sizeof int);

6. Umgang mit Arrays:

Das Zuweisen eines Arrays erfordert die manuelle Berechnung des Speicherplatzes mit malloc, während dies mit new nicht erforderlich ist. Wann immer Sie malloc() verwenden, müssen Sie die Anzahl der Bytes überprüfen, sie muss für Ihre Verwendung richtig sein.

Example,

// allocate memory for an array of 10 int using new.
// does not require any calculation.
int *ptr1 = new int[10];


// allocate memory for an array of 10 int using malloc().
// require calculation.
int *ptr2 = (int*)malloc(sizeof(int) * 10);

7. Überschreibbarkeit:

„new“ ist ein Operator, der von einer Klasse überschrieben werden kann, während malloc() nicht pro Klasse überschrieben werden kann.

8. Freigabe:

Durch new erstellte Objekte werden durch delete zerstört.

Example,

int *ptr1 = new int;

//use of ptr1

delete ptr1

Von malloc() zugewiesener Speicher wird von free() freigegeben.

int *ptr2 = (int*)malloc(sizeof(int));

//use of ptr2

free(ptr2);

Sehen wir uns nun die Unterschiede zwischen malloc und new in der untenstehenden Vergleichstabelle an.

Vergleichsdiagramm für malloc und neu (malloc vs. neu):

Funktion new malloc
Unterstützte Sprache C++-spezifische Funktionen Unterstützt von C und C++
Typ new ist ein Operator, der einen Typ und (optional) eine Reihe von Initialisierern für diesen Typ als Argumente akzeptiert. malloc() ist eine Bibliotheksfunktion, die eine Anzahl (von Bytes) als Argument akzeptiert.
Rückgaben Gibt einen Zeiger auf ein (optional) initialisiertes Objekt seines Typs zurück, das typsicher ist. Es wird ein void* zurückgegeben zeigt auf nicht initialisierten Speicher, der typunsicher ist.
Bei Fehler Bei einem Fehler wird eine bad_alloc-Ausnahme ausgelöst. Gibt NULL zurück
Erforderliche Größe Vom Compiler berechnet Muss in Bytes angegeben werden
Verarbeitung von Arrays Hat eine explizite Version Erfordert manuelle Berechnungen
Verwendung des Konstruktors Ja. Der Operator new ruft den Konstruktor eines Objekts auf. Nein
Überschreibbar Ja. Nein
Deallocation von malloc() zugewiesener Speicher wird von free() freigegeben. Objekte, die durch neu erstellt wurden, werden durch löschen zerstört.
Initialisierung Der Operator new könnte ein Objekt initialisieren und ihm Speicher zuweisen. Malloc gibt einen nicht initialisierten Speicherblock zurück.

Empfohlene Artikel für Sie:

  • C++-Programmierkurse und Tutorials
  • neuer Operator in C++ für dynamischen Speicher
  • malloc gegen calloc.
  • Einführung der Referenz in C++.
  • Zeiger in C/C++.
  • C++-Interviewfragen mit Antworten.
  • Liste einiger der besten C++-Bücher, die Sie gesehen haben müssen.
  • Interviewfragen zur dynamischen Speicherzuweisung.
  • MCQs auf C++.