Freigabe Resourcen
-
Hallo,
bin neu hier. Mal sehen, ob mir bzgl. meiner Frage jemand weiterhelfen kann.
Ich definiere mir einen eigenen Typen:
typedef struct _MyType { double* data; unsigned int count; } MYTYPE, * PMYTYPE;Dann benutze ich diesen neuen Typen:
PMYTYPE pmy = new MYTYPE[10]; /* ... */ delete [] pmy; pmy = NULL;Die Frage, die sich mir nun stellt ist, was passiert mit dem dynamischen Array data im Typen _MyType? Dieses muß doch theoretisch auch über delete[] freigegeben werden, oder nicht?
Vielleicht hat da jemand eine Idee?
Gruss. mbu.
-
Nein, nicht in C
-
mbu schrieb:
Dieses muß doch theoretisch auch über delete[] freigegeben werden, oder nicht?
nee, nur wenn du dafür auch speicher reserviert hast.
so:
PMYTYPE pmy = malloc (sizeof(MYTYPE)); pmy->data = malloc (...); ... free (pmy->data); free (pmy);wenn nicht, dann so:
PMYTYPE pmy = malloc (sizeof(MYTYPE)); pmy->data = irgendwas; // zeigt auf was statisches ... free (pmy);
-
Hm. Also wenn ich das ganze jetzt zum Beispiel so benutze:
typedef struct _MyType { double* data; unsigned int count; } MYTYPE, * PMYTYPE; PMYTYPE pmy = new MYTYPE[1]; pmy[0].count = 2; pmy[0].data = new data[ pmy[0].count ]; pmy[0].data[0] = 3.1; pmy[0].data[1] = 1.5; /* mach irgendwas */ delete [] pmy[0].data; // das hier ist also nötig? pmy[0].data = NULL; // .. delete [] pmy; pmy = NULL;Die markierte stelle ist also nötig, weil ich das data Feld ja dynamisch alloziere?
Und wenn das nötig ist, kann ich mein struct folgendermassen erweitern? Das ist nicht mehr ganz ANSI C, oder?

typedef struct _MyType { _MyType() : data(NULL), count(0) { } ~_MyType() { if( data != NULL ) { delete [] data; data = NULL; } } double* data; unsigned int count; } MYTYPE, * PMYTYPE;Gruss. mbu.
-
mbu schrieb:
Und wenn das nötig ist, kann ich mein struct folgendermassen erweitern? Das ist nicht mehr ganz ANSI C, oder?

new und delete sind nicht ANSI C. In C gibts dafür wie bereits erwähnt malloc() und free().
Die Frage ist nun: Willst du eine Lösung in C oder C++? Wenn letzteres der Fall ist verschiebe ich dich gerne.
-
Das tut mir Leid. Das war dann wohl Unwissenheit meinerseits. Es wäre nett, wenn Du das dann verschieben könntest.
Gruss. mbu.
-
Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
In C++ brauchst du für Strukturen und Klassen keinen typedef mehr, diese können auch ohne die Schlüsselwörter 'struct' bzw. 'class' aufgerufen werden.
[cpp]struct MyType
{
MyType() : data(NULL), count(0)
{
}~MyType()
{
if( data != NULL )
{
delete [] data;
data = NULL;
}
}double* data;
unsigned int count;
};MyType mytype; // alternativ: struct MyType mytype;
Wenn du jetzt noch die Variablen als 'private' deklarierst und entsprechende Getter- bzw. Settermethoden schreibst, dann ist das schon (fast) objektorientierte Programmierung (OOP).
Dein Ansatz für die Resourcenfreigabe ist so auf jeden Fall richtig.
Wenn du die Resourcenbelegung (mittels new) auch in der Struktur (bzw. Klasse) einbaust, dann hast du eine wunderbare Kapselung (such mal nach RAII).
-
Im Destruktor data auf != NULL zu prüfen macht keinen Sinn. So am Rande.
Was spricht egtl gegen std::vector< MyType > und std::vector< double >?
-
David_pb schrieb:
Im Destruktor data auf != NULL zu prüfen macht keinen Sinn. So am Rande.
Hm, warum macht das keinen Sinn? Wär ja schön, weil ich mir das dann immer sparen kann, aber wenn das NULL ist und ich delete[] mache, hab ich doch ein Problem, oder nicht?
David_pb schrieb:
Was spricht egtl gegen std::vector< MyType > und std::vector< double >?
Zum einen die Schnittstelle, die ich beachten muss. Ausserdem, und da bin ich mir nicht ganz sicher, wollte deswegen eigentlich auch an anderer Stelle nochmal nachfragen, dachte ich immer, dass der Zugriff auf std::vector<..> im Allgemeinen langsamer ist als auf dynamische Arrays?
Th schrieb:
Dein Ansatz für die Resourcenfreigabe ist so auf jeden Fall richtig.
Wenn du die Resourcenbelegung (mittels new) auch in der Struktur (bzw. Klasse) einbaust, dann hast du eine wunderbare Kapselung (such mal nach RAII).Dann habe ich ja wieder ganz schnell eine eigene Klasse für meinen Typen geschrieben.
Zum Stichwort RAII: Jetzt wo Du es sagst, bringt mich das darauf, dass ich das ja gerade im 'Effective C++' gelesen habe. Schnell mal nachgeschlagen... Item 13 (Use objects to manage resources) ist genau mein Thema. Danke für den Hinweis
Gruss. mbu
-
mbu schrieb:
David_pb schrieb:
Im Destruktor data auf != NULL zu prüfen macht keinen Sinn. So am Rande.
Hm, warum macht das keinen Sinn? Wär ja schön, weil ich mir das dann immer sparen kann, aber wenn das NULL ist und ich delete[] mache, hab ich doch ein Problem, oder nicht?
Nö, der Standard garantiert da ein delete ([]) auf einen 0-Pointer sicher ist und da garnichts schlimmes passiert. Kannst dir also überall ein Prüfen auf 0-Pointer vor delete ([]) sparen.
mbu schrieb:
David_pb schrieb:
Was spricht egtl gegen std::vector< MyType > und std::vector< double >?
Zum einen die Schnittstelle, die ich beachten muss. Ausserdem, und da bin ich mir nicht ganz sicher, wollte deswegen eigentlich auch an anderer Stelle nochmal nachfragen, dachte ich immer, dass der Zugriff auf std::vector<..> im Allgemeinen langsamer ist als auf dynamische Arrays?
Kommt drauf an wie du zugreifst. Über den Operator[] sollte es keine Geschwindigkeitsverluste geben.
-
David_pb schrieb:
Nö, der Standard garantiert da ein delete ([]) auf einen 0-Pointer sicher ist und da garnichts schlimmes passiert. Kannst dir also überall ein Prüfen auf 0-Pointer vor delete ([]) sparen.
Super. Vielen Dank. Wieder was gelernt. Dann werd ich den überflüssigen Quatsch mal schnell aus meinen Klassen entfernen.

Gruss. mbu.