new[] & delete[]

Man kann auch Arrays im Heap anlegen. Ich habe im Kapitel zu Arrays ja schon std::vector erwähnt, welcher das dynamische Anlegen von Arrays ermöglicht, welche von std::vector im Heap auch angelegt werden, aber dies ist entsprechend für den Programmierer gekapselt, so dass man während der Programmierung mit std::vector sich nicht darum kümmern muss. Daher auch hier die Empfehlung, bevor man selber etwas im Heap anlegt, zu überlegen, ob std::vector (oder ähnliche Containerklassen der STL) dies nicht auch tun könnten.
Muss man jedoch ein Array im Heap mit new anlegen, so geht dies mit new[]. Das 'normale' new kann nur eine Variable im Heap anlegen, aber kein Array. Auch für mit new[] angelegte Arrays gilt, das sie wieder vom Programmierer freigegeben werden müssen. Dies geschieht mit delete[].
Auch hier ein kurzes Codebeispiel:
int* api = new int[10];
for(int i =0; i < 10;++i)
    api[i]=i;
api[0] = 42;
// do something with api
delete[] api;


Auch beim anlegen eines Arrays mit new kommt die Anzahl der Arrayelemente in die eckigen Klammern. Danach muss auch das Array noch initialisiert werden. Auf die einzelnen Elemente des Arrays greift man über den Indexoperator zu, wie bei einem Array auf dem Stack. Der Arrayindex beginnt bei 0. Wenn das Array wieder freigegeben werden soll, ist es wichtig dass dies mit delete[] geschieht, mit delete würde sich hier ein Memoryleak ergeben. Die Größe des Arrays wird hierbei nicht angegeben.
Auch hier muss man erwähnen, das als Alternative zu new[] entsprechende Smartarray/Smartpointerklassen existieren. Welche die Freigabe für den Programmierer übernehmen, und ähnlich wie Smartpointer eine gute Alternative zum Handling mit reinen Pointern darstellen. Allerdings kommen diese Smartarrays erst mit C++11 in den Standardsprachraum von C++, für Code welcher diese nicht nutzen kann, empfehlen sich die Smartarrays aus boost.
Für das Anlegen dynamischer Arrays gibt es in C++ also diese 3 Alternativen:
  • Containerklassen wie std::vector
  • Smartarrays (aus boost oder in C++11)
  • new[] & delete[]