Heim > Backend-Entwicklung > C#.Net-Tutorial > C++ lernt die Funktionen new() und malloc()

C++ lernt die Funktionen new() und malloc()

little bottle
Freigeben: 2019-04-30 13:19:07
nach vorne
3717 Leute haben es durchsucht

Freunde, die sich mit C++ auskennen, sollten wissen, dass C++ Programmierern die Möglichkeit bietet, sich mit Hardware zu befassen, beispielsweise mit der Speicherverwaltung. Ein erfahrener C++-Programmierer kann die Leistung von C++-Programmen bis zum Äußersten optimieren und Hardwareressourcen beanspruchen. Und jetzt möchte ich über new und malloc() im Zusammenhang mit der Speicherverwaltung sprechen.

Lassen Sie uns zuerst über malloc() sprechen. Malloc ist eine von der C-Sprache geerbte Funktion. Ihr Rückgabeergebnis ist ein Zeiger auf den Speicher Der Zeiger, sein Funktionsprototyp und seine Verwendungsbeispiele lauten wie folgt:

/*
  函数原型
  其中__size是你要分配的大小,其单位是byte
*/
void* malloc(size_t __size);

// 用例
int* pInt = (int*) malloc(sizeof(int));               // 分配了一个int
double* pDoubleArray = (double*) malloc(sizeof(double) * 5);   // 分配了一个double数组,其大小为5
Nach dem Login kopieren
Im Allgemeinen kann malloc immer Speicher für Sie zuweisen. Es gibt aber auch Situationen, in denen die Situation überwältigend ist und die Erinnerung nicht ausreicht. Zu diesem Zeitpunkt gibt malloc einen Nullzeiger (NULL, nullptr) zurück. Wenn Sie malloc verwenden, sollten Sie jedes Mal überprüfen, ob der zurückgegebene Zeiger null ist.

Verwandte Tutorials:

C++-Video-Tutorial

Jetzt wurde der Speicher zugewiesen. Wenn das Programm einen bestimmten Punkt erreicht, möchte ich den Speicher nicht mehr. Zu diesem Zeitpunkt müssen wir den Speicher manuell freigeben, da sonst ein Speicherverlust auftritt. Geben Sie Speicher durch die Funktion free() frei. Der Funktionsprototyp und die Verwendungsbeispiele lauten wie folgt:

// 原型
void free(void* __ptr);

// 用例
free(pInt);
free(pDoubleArray);
Nach dem Login kopieren

Das Interessante ist, dass das, was Sie an die Funktion free übergeben, nur ein Zeiger ist, aber unabhängig davon, ob Sie ein Element oder ein Element zuweisen array , free kann Ihnen immer dabei helfen, diesen Speicher freizugeben (woher weiß free die Größe des von Ihnen zugewiesenen Arrays?)

Lassen Sie mich im Detail erklären, was malloc beim Zuweisen von Speicher tut. Wenn malloc Speicher zuweist, wird nicht nur die von Ihnen benötigte Speichergröße zugewiesen, sondern es werden auch einige zusätzliche Informationen zum Kopf und Ende Ihres Speichers hinzugefügt (allgemein bekannt als

Cookie

). Zum Beispiel die für DEBUG verwendeten Informationen und die Größe Ihres Speichers. Dies erklärt, warum es Ihren Speicher freigeben kann, da es weiß, wie groß Ihr Speicher ist. Es ist erwähnenswert, dass diese Cookies etwas Speicher beanspruchen. . . Okay, malloc wurde fast eingeführt. Eine andere Sache, die ich sagen möchte, ist, dass malloc nur eine Funktion eines Drittanbieters ist, keine Kernelfunktion des Betriebssystems. Wenn Sie zusätzliche Anforderungen haben, können Sie Ihr eigenes Malloc entwerfen. Lassen Sie uns als Nächstes über Neues sprechen.

Neu ist ein Manipulator (oder Schlüsselwort), der von C++ bereitgestellt wird. Es wird auch zum Zuweisen von Speicher verwendet. Seine Anwendungsfälle sind wie folgt:

int* pInt = new int(3);            // 分配并构造一个int
double* pDoubleArray = new double[5];    // 分配了一个double数组,其大小是5

delete pInt;                   // 删除单元素
delete[] pDoubleArray;             // 删除数组
Nach dem Login kopieren

Es ist immer noch ein altes Thema, das Programm kann Speicher für Sie zuweisen, aber was sollten Sie tun, wenn Sie am Ende Ihrer Kräfte sind?

Zu diesem Zeitpunkt löst das Programm

eine std::bad_alloc-Ausnahme aus. Beachten Sie, dass dies einer der Unterschiede zwischen new und malloc ist. Lobbar ist jedoch, dass C++ einen Mechanismus zur Behandlung von bad_alloc-Ausnahmen bereitstellt. Die Methode lautet wie folgt:

void BadAllocateHandler()
{
  std::cout << "啊,内存分配失败了" << std::endl;
  exit(0);
}

std::set_new_handler(BadAllocateHandler);
Nach dem Login kopieren
BadAllocateHandler ist eine vom Programmierer selbst geschriebene Verarbeitungsfunktion, wenn die Zuweisung fehlschlägt. Und set_new_handler ist ein von C++ bereitgestellter Mechanismus. Im Allgemeinen gibt es nur zwei Dinge, die Sie tun sollten, wenn es hart auf hart kommt. Lassen Sie das Programm entweder beenden oder finden Sie eine Möglichkeit, an anderer Stelle Speicher freizugeben, um mit der Zuweisung fortzufahren.

Sie wissen bereits, dass „Neu“ ein Schlüsselwort ist. Bei einem Programm kehren alle Aktionen zu Funktionsaufrufen zurück. Was genau ist also passiert, als es neu war? Wenn Sie eine neue Funktion erstellen, ruft das Programm zunächst die Funktion

::operator new() auf. Dann ruft das Programm in ::operator new() malloc() auf. Oh! Alles ist klar. Es stellt sich heraus, dass die Essenz von new darin besteht, die malloc-Funktion aufzurufen! ! Ebenso besteht der Kern von delete darin, die Funktion free() aufzurufen. Obwohl die Essenz von new darin besteht, malloc aufzurufen, gibt es einen großen Unterschied zwischen new und malloc. Das heißt, nachdem new aus dem Speicher kommt, hilft new Ihnen beim Aufbau des Objekts, während malloc nur Speicher zuweist. Das konkrete Beispiel lautet wie folgt:

class MyObj {
public:
  public MyObj(int value) : val(value) {}
  int val;
};

MyObj* obj = new MyObj(4);
MyObj* obj1 = (MyObj*) malloc(sizeof(MyObj));
Nach dem Login kopieren

Die Methode von new besteht darin, dass der Compiler nach der Zuweisung des Speichers durch malloc direkt den Konstruktor der Klasse aufruft, um das Objekt in diesem Speicher zu erstellen. Beachten! Nur der Compiler kann den Konstruktor einer Klasse direkt aufrufen. Und wenn Sie malloc verwenden, können Sie keine Objekte direkt darauf erstellen.

Das obige ist der detaillierte Inhalt vonC++ lernt die Funktionen new() und malloc(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
c++
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage