Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Zeigerfrage  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
kingcools
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.03.2008
Beiträge: 67
Beitrag kingcools Mitglied 09:43:46 11.03.2010   Titel:   Zeigerfrage            Zitieren

Folgendes Beispiel:

C/C++ Code:
BITMAP* tempanim =  new BITMAP[SIZE];
for(int i = 0; i < SIZE;i++)// i = 0 to i = 28
{                      {
tempanim[i] = *load_bitmap(temp.c_str(),NULL);
}
C/C++ Code:
BITMAP* tempanim = new BITMAP[SIZE];
for(int i = 0; i < SIZE;i++)// i = 0 to i = 28
{ {
tempanim[i] = *load_bitmap(temp.c_str(),NULL);
}
C/C++ Code:
BITMAP* tempanim =  new BITMAP[SIZE];
for(int i = 0; i < SIZE;i++)// i = 0 to i = 28
{                      {
tempanim[i] = *load_bitmap(temp.c_str(),NULL);
}


load_bitmap "Returns a pointer to the bitmap or NULL on error. Remember that you are responsible for destroying the bitmap when you are finished with it to avoid memory leaks. "

load_bitmap lädt, wer hätte es gedacht ein bitmap. Nun würde ich gerne die Adresse dieser Bitmaps im Speicher in den Zeiger tempanim laden, ABER mir ist gerade was eingefallen:

Muss ich statt einen Zeiger auf einen Array, hier einen Array von Zeigern benutzen? Ich muss ja, da eine Adresse auf einen dynamischen Speicher zurückgegeben wird, diese Adresse beibehalten und nicht nur den Inhalt der Speicherzelle auf die die Adresse verweist.
So wie es jetzt ist, speichere ich den Wert der Speicherzelle und verliere damit doch eine Adresse, oder? Ist diese Überlegung richtig?


Vielen Dank für eure Hilfe :)
__Stefan__
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.04.2007
Beiträge: 332
Beitrag __Stefan__ Mitglied 10:26:23 11.03.2010   Titel:              Zitieren

Code:
*load_bitmap(temp.c_str(),NULL)
Code:
*load_bitmap(temp.c_str(),NULL)
Code:
*load_bitmap(temp.c_str(),NULL)


Wenn das NULL zurück gibt bist du am Arsch. :)
krümelkacker
Unregistrierter




Beitrag krümelkacker Unregistrierter 10:36:02 11.03.2010   Titel:              Zitieren

...und auch sonst hätte er ein Problem: Speicherlecks. loadbitmap erzeugt das Objekt im Heap (wahrscheinlich). Er kann es aber nicht mehr löschen, weil der Zeiger verloren geht.
kingcools2
Unregistrierter




Beitrag kingcools2 Unregistrierter 11:52:01 11.03.2010   Titel:              Zitieren

sehr schön wie ihr auf meine Frage eingeht
krümelkacker
Unregistrierter




Beitrag krümelkacker Unregistrierter 13:04:56 11.03.2010   Titel:              Zitieren

kingcools2 schrieb:
sehr schön wie ihr auf meine Frage eingeht

Ich hatte es vorhin eilig und wollte nur kurz meinen Senf dazugeben. Ist denn jetzt noch was unklar?

>> Muss ich statt einen Zeiger auf einen Array, hier einen Array von Zeigern benutzen?

Du musst gar nichts. Kommt drauf an, was Du willst. Du kannst die Zeiger auch in einem Vektor speichern, oder in einem shared_ptr kapseln. Es gibt sooooo viele Möglichkeiten.

C/C++ Code:
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
BITMAP** frickelig = new BITMAP*[SIZE];
for (int k=0; k<SIZE; ++k) {
   frickelig[k] = loadbitmap(...);
}
for (int k=0; k<SIZE; ++k) {
   delete drickelig[k];
}
delete[] frickelig;
C/C++ Code:
1
2
3
4
5
6
7
8
BITMAP** frickelig = new BITMAP*[SIZE];
for (int k=0; k<SIZE; ++k) {
frickelig[k] = loadbitmap(...);
}
for (int k=0; k<SIZE; ++k) {
delete drickelig[k];
}
delete[] frickelig;
C/C++ Code:
1
2
3
4
5
6
7
8
BITMAP** frickelig = new BITMAP*[SIZE];
for (int k=0; k<SIZE; ++k) {
   frickelig[k] = loadbitmap(...);
}
for (int k=0; k<SIZE; ++k) {
   delete drickelig[k];
}
delete[] frickelig;


C/C++ Code:
vector<BITMAP*> besser (SIZE);
for (int k=0; k<SIZE; ++k) {
   besser[k] = loadbitmap(...);
}
for (int k=0; k<SIZE; ++k) {
   delete besser[k];
}
C/C++ Code:
vector<BITMAP*> besser (SIZE);
for (int k=0; k<SIZE; ++k) {
besser[k] = loadbitmap(...);
}
for (int k=0; k<SIZE; ++k) {
delete besser[k];
}
C/C++ Code:
vector<BITMAP*> besser (SIZE);
for (int k=0; k<SIZE; ++k) {
   besser[k] = loadbitmap(...);
}
for (int k=0; k<SIZE; ++k) {
   delete besser[k];
}


C/C++ Code:
vector<shared_ptr<BITMAP> > auchok (SIZE);
for (int k=0; k<SIZE; ++k) {
   shared_ptr<BITMAP> sp ( loadbitmap(...) );
   auchok[k] = sp;
}
C/C++ Code:
vector<shared_ptr<BITMAP> > auchok (SIZE);
for (int k=0; k<SIZE; ++k) {
shared_ptr<BITMAP> sp ( loadbitmap(...) );
auchok[k] = sp;
}
C/C++ Code:
vector<shared_ptr<BITMAP> > auchok (SIZE);
for (int k=0; k<SIZE; ++k) {
   shared_ptr<BITMAP> sp ( loadbitmap(...) );
   auchok[k] = sp;
}


...
CptC
Unregistrierter




Beitrag CptC Unregistrierter 13:21:33 11.03.2010   Titel:              Zitieren

krümelkacker schrieb:

C/C++ Code:
vector<shared_ptr<BITMAP> > auchok (SIZE);
for (int k=0; k<SIZE; ++k) {
   shared_ptr<BITMAP> sp ( loadbitmap(...) );
   auchok[k] = sp;
}
C/C++ Code:
vector<shared_ptr<BITMAP> > auchok (SIZE);
for (int k=0; k<SIZE; ++k) {
shared_ptr<BITMAP> sp ( loadbitmap(...) );
auchok[k] = sp;
}
C/C++ Code:
vector<shared_ptr<BITMAP> > auchok (SIZE);
for (int k=0; k<SIZE; ++k) {
   shared_ptr<BITMAP> sp ( loadbitmap(...) );
   auchok[k] = sp;
}


...


Wenn der Compiler schon unique_ptr aus C++0x kennt, dann lieber vector<unique_ptr<BITMAP>> oder alternativ boost::ptr_vector.

shared_ptr im vector hat viel unnötigen overhead.
kingcools2
Unregistrierter




Beitrag kingcools2 Unregistrierter 17:26:34 11.03.2010   Titel:              Zitieren

danke sehr :)
kingcools2
Unregistrierter




Beitrag kingcools2 Unregistrierter 20:11:34 12.03.2010   Titel:              Zitieren

ok, hab mich doch noch an ne frage erinnert^^

bzw neue unklarheit:

C/C++ Code:
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
BITMAP** frickelig = new BITMAP*[SIZE];
for (int k=0; k<SIZE; ++k) {
   frickelig[k] = loadbitmap(...);
}
for (int k=0; k<SIZE; ++k) {
   delete drickelig[k];
}
delete[] frickelig;
C/C++ Code:
1
2
3
4
5
6
7
8
BITMAP** frickelig = new BITMAP*[SIZE];
for (int k=0; k<SIZE; ++k) {
frickelig[k] = loadbitmap(...);
}
for (int k=0; k<SIZE; ++k) {
delete drickelig[k];
}
delete[] frickelig;
C/C++ Code:
1
2
3
4
5
6
7
8
BITMAP** frickelig = new BITMAP*[SIZE];
for (int k=0; k<SIZE; ++k) {
   frickelig[k] = loadbitmap(...);
}
for (int k=0; k<SIZE; ++k) {
   delete drickelig[k];
}
delete[] frickelig;


verstehe ich das richtig, dass bei nem pointer auf pointer ich echt 2 mal deleten muss?
Oder würde es auch mit einem "delete[]" ohne die einzelnen deletes vorher funktionieren?
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 12068
Beitrag SeppJ Moderator 20:14:43 12.03.2010   Titel:              Zitieren

Du musst genau das deleten, was du vorher mit new angefordert hast. Keine Tricks, keine Ausnahmen.
drakon
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.01.2008
Beiträge: 6809
Beitrag drakon Mitglied 20:23:13 12.03.2010   Titel:              Zitieren

SeppJ schrieb:
Du musst genau das deleten, was du vorher mit new angefordert hast. Keine Tricks, keine Ausnahmen.


Naja. So streng würde ich das nicht sagen. Man muss wenigstens wissen, wer es frei gibt (und darauf sollte man sich nur verlassen, wenn es explizit genau so gesagt wird, dass es gemacht wird). Siehe z.B Smart Pointer. Da erzeugst du mit new, gibst es aber explizit nirgends mehr selbst wieder frei mit delete (ist ja genau die Aufgabe des Smart Pointers).

_________________
Blog: www.drakon.ch


Zuletzt bearbeitet von drakon am 20:23:30 12.03.2010, insgesamt 1-mal bearbeitet
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Zeigerfrage  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.