| Autor |
Nachricht |
kingcools
Mitglied
Benutzerprofil
Anmeldungsdatum: 14.03.2008
Beiträge: 67
|
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
|
__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
|
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
|
kingcools2 Unregistrierter
11:52:01 11.03.2010 Titel: |
|
Zitieren |
sehr schön wie ihr auf meine Frage eingeht |
|
|
|
 |
krümelkacker
Unregistrierter
|
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
|
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
|
kingcools2 Unregistrierter
17:26:34 11.03.2010 Titel: |
|
Zitieren |
danke sehr |
|
|
|
 |
kingcools2
Unregistrierter
|
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
|
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
|
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 |
|
 |