PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c++: new in funktion aufrufen und speicher zurückgeben


raumbaum
2004-08-19, 15:39:20
Tach,

folgendes Problem:

Ich will innerhalb einer Funktion Speicher mit New reservieren und diesen an die main Funktion zurückgeben. Stimmt das so wie ich das geschrieben habe? Gibts da auch ne Möglichkeit um das Ganze mit einem Einfach Pointer anstatt mit einem 'Pointer auf Pointer' zu machen?


void func( **pSpeicher )
{
*pSpeicher= new int [10];

(*pSpeicher)[1] = 4;
}

int main ()
{
int *pTestSpeicher=0;

func(&pTestSpeicher)

delete [] pTestSpeicher;
}

ScottManDeath
2004-08-19, 17:02:59
du warst knapp davor : ;)
int* func( )
{
int* pSpeicher= new int [10];

pSpeicher[1] = 4;

return pSpeicher;
}

int main ()
{
int *pTestSpeicher=0;

pTestSpeicher = func();

delete [] pTestSpeicher;
}

Gast
2004-08-19, 17:15:25
Danke, aber ich hätte es gerne über die Funktionsparamter gelöst, da ich mehrmals Speicher in der Funktion reservieren will.

KiBa
2004-08-19, 17:28:23
wie wärs mit einer referenz auf einen pointer?
allerdings muss ich sagen, dass dein design wohl ne macke hat. du verwendest new, was aber zu c++ gehört und dort ist es eher üblich, ressourcen (auch speicher) in konstruktoren zu belegen und in destruktoren wieder frei zu geben und diese keinesfalls nach außen zu lassen geschweige denn eine nicht const referenz/pointer zurück zu geben.

GloomY
2004-08-19, 17:54:30
Danke, aber ich hätte es gerne über die Funktionsparamter gelöst, da ich mehrmals Speicher in der Funktion reservieren will.Ich denke mal, dass das schwierig werden wird, da C/C++ imho Call-by-Value benutzt, d.h. die Variablen innerhalb der Funktion bekommen nur Kopien der aufzurufenden Werte und diese werden nicht (wie bei Call-by-Value-Return) am Ende wieder zurückgeschrieben.

D.h. dass du um Zeiger (bzw. "Referenzen") wohl nicht herumkommen wirst.

Xmas
2004-08-19, 19:58:28
void func( **pSpeicher )
Da fehlt noch ein Datentyp zum Pointer. Ansonsten sollte es funktionieren. Nur empfehlenswert ist das so eigentlich nicht, da schließe ich mich KiBa an.

Xmas
2004-08-19, 20:11:39
Ich denke mal, dass das schwierig werden wird, da C/C++ imho Call-by-Value benutzt, d.h. die Variablen innerhalb der Funktion bekommen nur Kopien der aufzurufenden Werte und diese werden nicht (wie bei Call-by-Value-Return) am Ende wieder zurückgeschrieben.

D.h. dass du um Zeiger (bzw. "Referenzen") wohl nicht herumkommen wirst.
C++ bietet auch Call-by-Reference (&). Und Zeiger und Referenzen widersprechen doch nicht dem, was raumbaum machen will.

GloomY
2004-08-20, 03:34:32
C++ bietet auch Call-by-Reference (&).Ja klar, das meinte ich ja mit "da wird man um Zeiger nicht herumkommen". Zeiger sind ja die Art und Weise wie man bei Call-by-Reference die Parameter übergibt.

Crushinator
2004-08-20, 10:11:22
Ich schließe mich den Vorrednern an, was den Sinn angeht. Wofür man das auch immer braucht.... So funktioniert's jedenfalls:


void func(int **pSpeicher)
{

*pSpeicher = new int [10];

(*pSpeicher)[0] = 9;
(*pSpeicher)[1] = 1;
(*pSpeicher)[2] = 3;

}

int main ()
{
int *pTestSpeicher=0;

func(&pTestSpeicher);

if (pTestSpeicher != NULL)
cout << pTestSpeicher[2];

delete [] pTestSpeicher;

}

Gast
2004-08-20, 11:59:41
Danke für die Hilfe :)

KiBa
2004-08-20, 19:01:00
wenn ich es vom design her wirklich so machen müsste, würde ich eine referenz auf einen zeiger nehmen und keinen zeiger auf einen zeiger. einfach weil es sich besser schreiben lässt. nachteil ist natürlich, dass der aufrufer dann nicht mehr sofort erkennen kann, was sache ist...