Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
CRaumschiff *spieler=NULL; spieler= new CRaumschiff[Anzahl]; for (int i=0;i<Anzahl;i++) { cout<<"Spieler:"<<i+1<<endl; spieler[i].init (); } spielerausgeben(&spieler, Anzahl); delete [] spieler; spieler=0; return 0; } void spielerausgeben (CRaumschiff *spieler[],int Anzahl) { for (int i=0;i<Anzahl;i++) { spieler[i].zeigedaten();//hier sitzt der Fehler habs auch mit -> schon probiert } } |
C-/C++-Quelltext |
|
1 |
spielerausgeben(&spieler, Anzahl);
|
C-/C++-Quelltext |
|
1 |
spielerausgeben(spieler, Anzahl); |
C-/C++-Quelltext |
|
1 |
void spielerausgeben (CRaumschiff *spieler[],int Anzahl) |
C-/C++-Quelltext |
|
1 |
void spielerausgeben (CRaumschiff *spieler,int Anzahl) |
Zitat von »"Danda"«
C-/C++-Quelltext
1 2 CRaumschiff *spieler=NULL; spieler= new CRaumschiff[Anzahl];
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
CRaumschiff* pPlayer; // variable definieren pPlayer = (CRaumschiff*)malloc(sizeof(CRaumschiff)); // speicher allokieren pPlayer = new CRaumschiff(); ... if(pPlayer) // loeschen, falls nicht null delete pPlayer; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
int iPlayerSize; CRaumschiff** pPlayer; // variable definieren pPlayer = (CRaumschiff*)malloc(sizeof(CRaumschiff) * iPlayerSize); // speicher allokieren (fuer array) for( int i = 0; i < iPlayerSize; i++ ) { pPlayer[i] = (CRaumschiff*)malloc(sizeof(CRaumschiff)); // speicher allokieren (fuer array) pPlayer[i] = new CRaumschiff(); // player anlegen } ... if(pPlayer) { // loeschen, falls nicht null for( int i = 0; i < iPlayerSize; i++ ) { if(pPlayer[i]) // loeschen, falls nicht null delete pPlayer[i]; } delete[] pPlayer; // array loeschen } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
CRaumschiff* pPlayer; pPlayer = (CRaumschiff*)malloc(sizeof(CRaumschiff)); pPlayer = new CRaumschiff(); // Memory leak ... if(pPlayer) // total unnötig, da delete auf einen 0-Zeiger sicher ist delete pPlayer; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
int iPlayerSize; CRaumschiff** pPlayer; // Warum denn ein Doppelzeiger? Ist doch total fehl am Platz. pPlayer = (CRaumschiff*)malloc(sizeof(CRaumschiff) * iPlayerSize); for( int i = 0; i < iPlayerSize; i++ ) { pPlayer[i] = (CRaumschiff*)malloc(sizeof(CRaumschiff)); pPlayer[i] = new CRaumschiff(); // memoryleak } ... if(pPlayer) { // ist immer noch unnötig, s.o. for( int i = 0; i < iPlayerSize; i++ ) { if(pPlayer[i]) // Ist auch unnütz ohne Ende delete pPlayer[i]; } delete[] pPlayer; // array loeschen } |
C-/C++-Quelltext |
|
1 |
pPlayer = new CRaumschiff(); |
Zitat von »"TheWinner"«
wiso gibt das einen memoryleak bei
C-/C++-Quelltext
1 pPlayer = new CRaumschiff();
??
Zitat von »"TheWinner"«
doppelzeiger habe ich, da es ja ein ARRAY auf ZEIGER ist...
C-/C++-Quelltext |
|
1 |
CRaumschiff* ptr_player_arr(new CRaumschiff[Anzahl](Parameter)); |
Zitat von »"Deviloper"«
Warum das nen Leak gibt? Weil erst malloc nen Speicher anfordert. Aber da es eine C Funktion ist, keinen Konstruktor für das Objekt aufruft. Dann reservierst du nochmal neuen Speicher und rufst diesesmal die Konstruktor auf Dabei geht dir der Zeiger auf den alten Speicher verloren (du merkst ihn dir nicht mehr), wodurch es nichtmehr möglich ist, free darauf aufzurufen.
Das was unschön ist, ist die init-Funktion. Mach lieber nen Konstruktor und ruf das dann so auf:
... Schreib dir beim Variablennamen ruhig dazu, das es sich um einen Array handelt(delete ist undefiniert bei array, delete [] ist korrekt). Parameter durch die von dir gewünschten Parameter für den Konstruktor ersetzen.
C-/C++-Quelltext
1 CRaumschiff* ptr_player_arr(new CRaumschiff[Anzahl](Parameter));
C-/C++-Quelltext |
|
1 2 3 4 |
CRaumschiff* p = ( CRaumschiff* )malloc( sizeof( CRaumschiff ) * 100 ); // nehmen wir mal 100 for ( unsigned i = 0; i < 100; ++i ) new ( &i[ p ] ) CRaumschiff( parameter ... ); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <iostream> #include <string> #include <vector> // ------------------------------------------------------------------ class Raumschiff { std::string name_; // Exemplarisch, damit die Klasse etas Leben bekommt public: Raumschiff(std::string const& name) : name_(name) { } std::string getName() const { return name_; } void setName(std::string const& name) { name_ = name; } }; // ------------------------------------------------------------------ void ausgeben(Raumschiff const&); // Prototyp // ------------------------------------------------------------------ int main() { // std::vector anlegen und mit Raumschiffen "bevölkern" std::vector<Raumschiff> raumschiffe; raumschiffe.push_back(Raumschiff("Enterprise")); raumschiffe.push_back(Raumschiff("Heart of Gold")); raumschiffe.push_back(Raumschiff("Executor")); // Durch die gespeicherten Raumschiffe iterieren und die // Objekte mittels Funktion 'ausgeben' ausgeben. std::vector<Raumschiff>::const_iterator iter = raumschiffe.begin(); for( ; iter != raumschiffe.end(); ++iter) { ausgeben(*iter); } return EXIT_SUCCESS; } // ------------------------------------------------------------------ void ausgeben(Raumschiff const& schiff) { std::cout << "Raumschiff: " << schiff.getName() << std::endl; } |
Werbeanzeige