Fragensteller
Einen Pointer auf einen Pointer returnen?

Frage
-
Hallo zusammen,
da ich leider gerade vor einem Problem stehe, wende ich mich an euch.
Mensch** GetMenschen() { Lehrer *mittermeier = new Lehrer("Thomas", "Mittermeier", "Englisch"); Lehrer *hansi = new Lehrer("Hans", "Zimmer", "Latein"); Lehrer *kasper = new Lehrer("Kasper", "Hauser", "Mathematik"); Schueler *manfred = new Schueler("Manfred", "Rummelzicke", false); Schueler *dieter = new Schueler("Dieter", "Meier", true); Mensch *menschen[5] = {mittermeier, hansi, kasper, manfred, dieter}; return menschen; }
Ich möchte eine Array von Mensch sozusagen return. Da ich ja in diesem Beispiel Speicher allokiere,
wird dieser ja beim verlassen der Funktion wieder freigegeben. Somit würde ja der Pointer auf freigegeben Speicherplätze zeigen,
wobei ich nicht verstehe, warum die AccessViolationException erst aufs 2. Element erscheint. Könnt ihr mir vielleicht sagen, wie ich das besser machen kann, bzw.
wie es funktionieren würde.
Vielen Danke für eure Hilfe.
Michael
Alle Antworten
-
Mensch *menschen[5] = {mittermeier, hansi, kasper, manfred, dieter};
Du musst natürlich den Speicher für das Array ja auch irgendwo allokieren... hier wird der Speicher für das Array nur auf dem Stack angelegt; deshalb führt dies dann zm Absturz.
Also z.B. so:
Mensch *m = new Mensch(); Mensch** menschen = new Mensch*[5]; menschen[0] = m; return menschen;
Jochen Kalmbach (MVP VC++) -
Hallo Jochen,
vielen Danke für die Antwort.
Nur leider bekomm ich jetzt eine Debug Assertion Failed Exception.
BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Setzte ich beim compilen auf Release, meldet er, das ein Heap beschädigt wurde.
Mensch** GetMenschen(); int _tmain(int argc, _TCHAR* argv[]) { Mensch **menschen = GetMenschen(); for(int i = 0; i < 5; i++) { menschen[i]->GetInfo(); } getchar(); return 0; } Mensch** GetMenschen() { Lehrer *mittermeier = new Lehrer("Thomas", "Mittermeier", "Englisch"); Lehrer *hansi = new Lehrer("Hans", "Zimmer", "Latein"); Lehrer *kasper = new Lehrer("Kasper", "Hauser", "Mathematik"); Schueler *manfred = new Schueler("Manfred", "Rummelzicke", false); Schueler *dieter = new Schueler("Dieter", "Meier", true); Mensch** menschen = new Mensch*[5]; menschen[0] = mittermeier; menschen[1] = hansi; menschen[2] = kasper; menschen[3] = manfred; menschen[4] = dieter; return menschen; }
- Bearbeitet Luckfried Mittwoch, 26. Januar 2011 20:14
-
Folgendes funktioniert bei mir problemlos.
Du hast vermutlich noch Probleme mit Deinen Strings....
Verwende lieber "std::string"... oder beschäftige Dich mal mit stdrup...
AUch würde ich Dir empfehlen Dich mit "std::vector" zu beschäftigen; das macht ein Array viel einfacher...Auch lege bitte ein Win32 Projekt an und kein .NET (CLR) Projekt!!!
#include <tchar.h> #include <string> class Mensch { public: Mensch(const char* vorname, const char* nachname) { Vorname = vorname; Nachname = nachname; } std::string Vorname; std::string Nachname; virtual std::string GetInfo() { return Vorname + " " + Nachname; } }; class Lehrer : public Mensch { public: Lehrer(const char* vorname, const char* nachname, const char*) : Mensch(vorname, nachname) { } }; class Schueler : public Mensch { public: Schueler(const char* vorname, const char* nachname, bool) : Mensch(vorname, nachname) { } }; Mensch** GetMenschen(); int _tmain(int argc, _TCHAR* argv[]) { Mensch **menschen = GetMenschen(); for(int i = 0; i < 5; i++) { printf("%s\n", menschen[i]->GetInfo().c_str()); } return 0; } Mensch** GetMenschen() { Lehrer *mittermeier = new Lehrer("Thomas", "Mittermeier", "Englisch"); Lehrer *hansi = new Lehrer("Hans", "Zimmer", "Latein"); Lehrer *kasper = new Lehrer("Kasper", "Hauser", "Mathematik"); Schueler *manfred = new Schueler("Manfred", "Rummelzicke", false); Schueler *dieter = new Schueler("Dieter", "Meier", true); Mensch** menschen = new Mensch*[5]; menschen[0] = mittermeier; menschen[1] = hansi; menschen[2] = kasper; menschen[3] = manfred; menschen[4] = dieter; return menschen; }
Jochen Kalmbach (MVP VC++) -
also das ist ein ganz normales Win32 Console Application Projekt.
Wenn die Fehlermeldung eine "AccessViolationException" ist, so hört sich das verdammt nach .NET an...
In einer native Anwendung sieht sowas so aus:
Unhandled exception at 0x00fd410c in CPP_VS2010.exe: 0xC0000005: Access violation reading location 0x12345678.
Jochen Kalmbach (MVP VC++)