Problem mit Zeiger und Speicher
-
Hallo, ich habe folgendes Problem:
Ich rufe in meiner Anwendung über eine Funktion ein DLL-Funktion auf, die ein bestimmtes File parst. Dabei wird ein Array erzeugt, dessen größe zum Zeitpunkt des Aufrufes noch nicht feststeht.
Funktion in Anwendung:
float *p; int i = ParseFile(FileName, pArray);
In der DLL Funktion wird jetzt dynamisch Speicher angelegt
pArray = new pArray[50];
Wieso kann ich jetzt auf diesen Speicher nicht mehr ausserhalb der DLL (sprich in der aufrufenden Funktion) zugreifen?
-
Weil der Parameter falsch ist, entweder ein Zeiger auf einen Zeiger (C) oder eine Referenz (C++), also
float *p; int i = ParseFile(FileName, &p);
und in der DLL dann:
int ParseFile(const char *FileName, float **p) { int x = 100; // nur so als Beispiel *p = new float[x]; ... }
Außerdem muß du den Speicher dann über eine Funktion in der DLL wieder freigeben, NICHT im Hauptprogramm delete aufrufen!!!
-
2 Fragen:
1. Wieso kann ich den Speicher nicht im Programm freigeben? Muss ich dann den Array in einen lokalen Array kopieren um die Daten weiter "zu halten"?
2. Wieso brauch ich einen Zeiger auf einen Zeiger (innerhalb einer Anwendung brauche ich es doch auch nicht?)z.B.
float *x; x = new float[2];
-
Zu 1.)
Weil der Heap-Speicher der DLL NICHT identisch ist mit dem Heap-Speicher
der Anwendung.
Zu 2.)
Wenn du einen Pointer übergibst dann kannst du den Inhalt auf den der Pointer
zeigt in der Funktion ändern, du kannst aber nicht den Pointer selbst ändern
(neu erstellen). Zu diesem Zweck kannst du einen Pointer auf einen Pointer
übergeben.