Latest web development tutorials

C ++ dynamischen Speicher

Verstehen Sie den dynamischen Speicher in C ++ ist es, wie die Arbeit von einem qualifizierten C ++ Programmierer wesentlich geworden ist. C ++ Programmspeicher ist in zwei Teile unterteilt:

  • Stack: alle Variablen in einer Funktion deklariert wird den Stapelspeicher in Anspruch nehmen.
  • Heap: Dies ist derProgrammspeicher nicht verwendet wird, kann das Programm ausgeführt wird dynamisch verwendet werden , um Speicher zuzuweisen.

Viele Male, können Sie nicht im Voraus vorhersagen, wie viel Speicher benötigt wird eine Variable in der spezifischen Informationen definiert zu speichern erforderlich, um die Größe des Speichers zur Laufzeit benötigt, um zu bestimmen.

In C ++ können Sie einen speziellen Operator wird während der Laufzeit innerhalb der Halde zu einer Variablen eines bestimmten Typs von Speicher zugewiesen verwenden, es gibt den Adressraum zugeordnet. Dieser Operator wirdneuer Betreiber.

Wenn Sie dynamisch nicht Speicher zuweisen müssen, können Sie denLösch Operator, durch den neuen Betreiber vor dem zugewiesenen Speicher gelöscht verwenden.

neue und löschen Operatoren

Hier ist der neue Betreiber ist jede allgemeine Syntax von Datentyp dynamische Zuweisung von Speicher zu sein:

new data-type;

Hier Datentyp kann ein beliebiger eingebauten Datentypen, einschließlich Anordnungen, kann jede Art von Daten sein , einschließlich einer Klasse oder Struktur, einschließlich benutzerdefiniert.Lassen Sie uns an den eingebauten Datentypen zuerst. Zum Beispiel können wir einen Zeiger auf einen Zeiger vom Typ double, dann fordert Speicher, wobei der Speicher zur Laufzeit definieren zugeordnet ist. Wir können dieneuen Betreiber in Übereinstimmung mit der folgenden Anweisung verwenden , um dies zu erreichen:

double* pvalue  = NULL; // 初始化为 null 的指针
pvalue  = new double;   // 为变量请求内存

Wenn die freien Speicherbereiche ausgeschöpft sind, ist es nicht erfolgreich Speicher zuordnen kann. Es ist ratsam, zu überprüfen, ob der neue Betreiber einen NULL-Zeiger zurückgibt, und nehmen Sie die entsprechende Aktion wie folgt vor:

double* pvalue  = NULL;
if( !(pvalue  = new double ))
{
   cout << "Error: out of memory." <<endl;
   exit(1);

}

malloc () Funktion in der Sprache C erschienen in C ++ noch vorhanden ist, aber es wird nicht empfohlen , malloc () Funktion zu verwenden.neue und malloc () Funktion im Vergleich zu seinen Hauptvorteil besteht darin, dass nicht nur neue Speicher zuweisen, sie schuf auch das Objekt.

Zu jeder Zeit, wenn Sie das Gefühl, dass eine dynamische Variablen bereits zugewiesenen Speicher nicht mehr benötigt wird, können Sie den Delete-Operator verwenden, um die Speicher freizugeben es verwendet wird, wie folgt:

delete pvalue;        // 释放 pvalue 所指向的内存

Wird in dem obigen Konzept zeigt das folgende Beispiel, wie das neue zu verwenden und zu löschen Operatoren:

#include <iostream>
using namespace std;

int main ()
{
   double* pvalue  = NULL; // 初始化为 null 的指针
   pvalue  = new double;   // 为变量请求内存
 
   *pvalue = 29494.99;     // 在分配的地址存储值
   cout << "Value of pvalue : " << *pvalue << endl;

   delete pvalue;         // 释放内存

   return 0;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

Value of pvalue : 29495

Ein Array aus dynamischen Speicherzuweisung

Angenommen, wir ein Zeichen-Array (eine Kette von 20 Zeichen) wollen Speicher zuweisen, können wir das obige Beispiel von Array-Syntax verwenden, um dynamisch Speicher zuweisen, wie folgt:

char* pvalue  = NULL;   // 初始化为 null 的指针
pvalue  = new char[20]; // 为变量请求内存

Um ein Array löschen gerade erstellten wir, ist die Aussage, wie folgt:

delete [] pvalue;        // 删除 pvalue 所指向的数组

Hier ist die allgemeine Syntax neue Bediener kann Speicher für die mehrdimensionale Arrays wie folgt verteilt werden:

int ROW = 2;
int COL = 3;
double **pvalue  = new double* [ROW]; // 为行分配内存

// 为列分配内存
for(int i = 0; i < COL; i++) {
    pvalue[i] = new double[COL];
}

Lassen Sie mehrdimensionales Array-Speicher:

for(int i = 0; i < COL; i++) {
    delete[] pvalue[i];
}
delete [] pvalue; 

Dynamische Speicherzuweisung Objekt

Das Objekt ist nicht verschieden von einfachen Datentypen. Betrachten wir zum Beispiel den folgenden Code ein, werden wir ein Array von Objekten verwendet werden, dieses Konzept zu verdeutlichen:

#include <iostream>
using namespace std;

class Box
{
   public:
      Box() { 
         cout << "调用构造函数!" <<endl; 
      }
      ~Box() { 
         cout << "调用析构函数!" <<endl; 
      }
};

int main( )
{
   Box* myBoxArray = new Box[4];

   delete [] myBoxArray; // Delete array

   return 0;
}

Wenn Sie ein Box wollen enthält vier Objekte Speicher-Array zuweisen, wird der Konstruktor viermal aufgerufen werden, auf die gleiche Weise, wenn Sie diese Objekte löschen, wird die destructor die gleiche Anzahl von Malen (viermal) aufgerufen werden.

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

调用构造函数!
调用构造函数!
调用构造函数!
调用构造函数!
调用析构函数!
调用析构函数!
调用析构函数!
调用析构函数!