Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Speicher-Freigabe-Problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.03.2014, 17:17 Uhr
banshee



Hallo,

ich habe versucht, mein Problem mit folgendem Snippet zu synthetisieren:


C++:
char* foo;
if(!AllocateSth(&foo))
  foo = "default";

useFoo(foo);

delete[] foo; // ???


Es wird eine Funktion aufgerufen, die Speicher allokiert, falls das nicht klappt, wird ein Default-String eingetragen. Nach seiner Benutzung würde ich ihn dann gerne wieder löschen, kann nun aber ja nicht ausschließen, dass er auf dem Stack liegt und das delete mein Programm crashed.
Eine Brute-Force-Lösung wäre, einfachein Flag darüber mitzuführen, ob der Speicher auf dem Heap liegt oder nicht, aber das erscheint schon sehr umständlich. Gibts da eine schönere Lösung für das Konstrukt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.03.2014, 00:27 Uhr
Hans
Library Walker
(Operator)


Kannst Du beim allokieren nicht irgendwie sicher Stellen, dass der Speicher in jedem Fall auf dem Heap liegt? - Dann wäre die Crashgefahr über den Stack jedenfalls gebannt.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 15.03.2014 um 00:28 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.03.2014, 00:21 Uhr
ao

(Operator)



Zitat von banshee:
Es wird eine Funktion aufgerufen, die Speicher allokiert, falls das nicht klappt, wird ein Default-String eingetragen.

Das sehe ich, aber welchen Zweck hat das? Was kannst du mit dem "default"-Wert Sinnvolles anfangen? Warum nicht so?

C++:
char * foo = AllocSth ();
if (foo != 0)
{
    usefoo (foo);
    delete [] foo;
}


Dieser Post wurde am 17.03.2014 um 00:21 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.03.2014, 10:30 Uhr
banshee



Zunächst mal habe ich diesen Code nicht selbst geschrieben, sondern es ist uralter C-Code, der so jetzt in unserer Software drinhängt. Schuld ist also irgendwer anderes.

Die Funktion AllocSth liest Strings aus einer Konfigurationsdatei und allokiert diese bei Erfolg im char-Zeiger. Klappt das nicht, wird eben ein Default-Parameter benutzt. Klar kann ich diesen char jetzt auch noch auf den Heap zwingen, aber da das ja ein statischer String ist, wirkt das irgendwie auch unschön.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.03.2014, 11:20 Uhr
TOSHMAX



Wenn dieser statische String konstant ist, sollte er auch immer dieselbe Adresse haben. Könntest du die beiden Pointer nicht beim Löschen vergleichen? Wenn sie ungleich sind weißt du, dass es sich um einen String auf dem Heap handelt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.03.2014, 13:41 Uhr
ao

(Operator)



Zitat von banshee:
Die Funktion AllocSth liest Strings aus einer Konfigurationsdatei und allokiert diese bei Erfolg im char-Zeiger. Klappt das nicht, wird eben ein Default-Parameter benutzt.

Ach so, also nicht das Allokieren schlägt fehl, sondern das Finden des Parameters in der Konfig-Datei, richtig?


Zitat:
Klar kann ich diesen char jetzt auch noch auf den Heap zwingen, aber da das ja ein statischer String ist, wirkt das irgendwie auch unschön.

Trotzdem, ich würde das so machen: Wenn die Datei keinen Treffer enthält, dann

C++:
foo = strdup ("default");

und dann einen fetten Kommentar dran, der erklärt, was dieser Mist soll.

Das ist insofern immer noch schöner als vorher, als du beim Wegräumen des Speichers nichts mehr unterscheiden musst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: