Zeiger als Parameter
-
Hallo,
habe folgende Verständnisfrage:
Ich übergebe der folgenden Methode per Referenz einen CString und einen int-Wert, um innerhalb der Funktion den "Originalen" Werte zuzuweisen.
Außerdem möchte ich innerhalb der Methode ein Feld von int-Werten zuweisen (dritter Parameter: int* pData), wobei ich hier den Zeiger nicht einfach auf die Adresse des anderen setzen, sondern eine elementweise Kopie erzeugen will. Jetzt steht allerdings erst innerhalb der Funktion fest, wieviele Elemente dieses int-Feld haben wird. Ich wollte das mittels Zeile (*) lösen, allerdings funktioniert das offensichtlich nicht so, wie ich mir das vorstelle.CString Text; short nAnzahl; short *pData = NULL;void CData::GetData(CString& Text, int& nAnzahl, int* pData) const { Text = m_Text; nAnzahl = m_nAnzahl; pData = new short[m_nAnzahl]; // (*) for (int nIndex = 0; nIndex < m_nAnzahl; nIndex++) pData[nIndex] = m_pData[nIndex]; }Nach Verlassen der Funktion steht der Zeiger wieder auf NULL.
Mir ist nun zum einen nicht wirklich klar, warum das so ist und zum anderen weiß ich nicht, wie ich das Problem umgehen kann. (Ich möchte der Methode die zu Initialisierenden Elemente übergeben.)Würde mich freuen, wenn mir das jemand kurz erläutern kann.
Danke vorab,
Nanuq
-
Nunja, auch Zeiger kann man by-value und by-reference übergeben. Du übergibst hier den Zeiger pData by-value, empfängst also das was beim Aufruf von GetData an diese Funktion übergeben wird. Dieser Wert (bessergesagt die Adresse, also 0) wird nach pData kopiert. Dann änderst Du die Kopie, und handelst Dir damit sogar noch ein Speicherleck ein (da der mit new allokierte Speicher ausserhalb der Funktion nicht mehr verfügbar ist).
Wie gesagt, auch den Zeiger müsstest Du by-reference übergeben:
void CData::GetData(CString& Text, int& nAnzahl, int*& pData) const
-
auch Zeiger kann man by-value und by-reference übergeben
Das war mir nicht bewusst, obwohl es eigentlich völlig logisch ist. Naja, vielen Dank jedenfalls!