Hallo
Wie kann ich so etwas:
int* pStructure = new int[1];
.. während der Laufzeit noch vergrössern, ohne einen vollkommen neuen Speicherbereich zu reservieren?
Einfach so, dass die vorhandenen Daten so bleiben wie sie sind und das Array noch etwas mehr Platz hat.
Ich möchte das nach Möglichkeit ohne std::vector machen.
Schon mal Danke!
Programmieren - alles kontrollieren 4.934 Themen, 20.613 Beiträge
Ich habe mir das mit den Zeigern aufgezeichnet, ganz begrieife ich es aber noch nicht.
Ich übergebe den Zeiger, der auf mein Array zeigt.
Eben nicht, sondern eine kopie des inhaltes, d.h. die adresse des arrays.
Dann kopiere ich die Daten aus dem Array in das neue.
Jetzt lösche ich das Array, auf das mein Zeiger zeigte.
Dem Zeiger gebe ich die Adresse der neuen Daten.
Ja, aber dem zeiger mit der kopie der alten adresse. Das irritierende ist, dass die variablen beide gleich heißen (p_iArray).
Nicht die variable von int* p_iArray = new int[20]; wird geändert, sondern die aus void CUtilities::ResizeArray(int* p_iArray, int iNewSize, int iOldSize)
Im der Main.cpp habe ich aber immer noch den alten Zeiger auf den gelöschten Speicherbereich.
Exakt. Das ist eine andere variable mit dem gleichen namen.
Passiert nicht genau das auch bei der Zeiger auf Zeiger Variante von dir?
Nein, denn hier wird nicht die adresse des arrays übergeben, sondern die adresse der stelle, wo die adresse des arrays gespeichert ist. In p_iArray aus void CUtilities::ResizeArray(int** p_iArray, int iNewSize, int iOldSize) steht also die adresse der adresse. Wenn nun die zuweisung (*p_iArray = NewArray;) kommt, dann wird genau dort, wo die alte adresse steht, die neue hingeschrieben.
Der aufruf von CUtilities::ResizeArray ist definitiv falsch, weil nur die kopie der adresse verändert wird und dieser wert beim rücksprung verloren geht.
Ich sehe gerade, dass meine erste Variante auch funktioniert.
Wieso jetzt das?
Dass es jetzt scheinbar geht, liegt daran, dass einfach illegale, aber vorhandene speicherbereiche überschrieben werden. Das freigeben per delete[] löscht nicht den speicher, sondern gibt diesen nur für andere verwendungen frei, so in etwa wie beim normalen löschen von dateien.
mr.escape
Ich übergebe den Zeiger, der auf mein Array zeigt.
Eben nicht, sondern eine kopie des inhaltes, d.h. die adresse des arrays.
Dann kopiere ich die Daten aus dem Array in das neue.
Jetzt lösche ich das Array, auf das mein Zeiger zeigte.
Dem Zeiger gebe ich die Adresse der neuen Daten.
Ja, aber dem zeiger mit der kopie der alten adresse. Das irritierende ist, dass die variablen beide gleich heißen (p_iArray).
Nicht die variable von int* p_iArray = new int[20]; wird geändert, sondern die aus void CUtilities::ResizeArray(int* p_iArray, int iNewSize, int iOldSize)
Im der Main.cpp habe ich aber immer noch den alten Zeiger auf den gelöschten Speicherbereich.
Exakt. Das ist eine andere variable mit dem gleichen namen.
Passiert nicht genau das auch bei der Zeiger auf Zeiger Variante von dir?
Nein, denn hier wird nicht die adresse des arrays übergeben, sondern die adresse der stelle, wo die adresse des arrays gespeichert ist. In p_iArray aus void CUtilities::ResizeArray(int** p_iArray, int iNewSize, int iOldSize) steht also die adresse der adresse. Wenn nun die zuweisung (*p_iArray = NewArray;) kommt, dann wird genau dort, wo die alte adresse steht, die neue hingeschrieben.
Der aufruf von CUtilities::ResizeArray ist definitiv falsch, weil nur die kopie der adresse verändert wird und dieser wert beim rücksprung verloren geht.
Ich sehe gerade, dass meine erste Variante auch funktioniert.
Wieso jetzt das?
Dass es jetzt scheinbar geht, liegt daran, dass einfach illegale, aber vorhandene speicherbereiche überschrieben werden. Das freigeben per delete[] löscht nicht den speicher, sondern gibt diesen nur für andere verwendungen frei, so in etwa wie beim normalen löschen von dateien.
mr.escape