Klasse instanziieren mit malloc
-
Ist es möglich, mit malloc eine Klasse zu instanziieren? Wie verhält sich der Einsatz von new generell zu malloc? Ich habe in einem anderen Beitrag erfahren, dass delete den Speicher nicht mehr ans Betriebssystem freigibt, sondern lediglich ans Programm. Da ich von C auf C++ umsteige, stört mich das etwas. Wie geht ihr mit dieser Tatsache (?) um?
-
malloc() solltest du wirklich nur verwenden, wenn du mit POD-Objekten zu tun hast ("Plain Old Data" - d.h. im wesentlichen C-Style structs). Bei echten C++ Klassen hat malloc() das Problem, daß es keine Konstruktoren kennt - damit holst du dir nicht-initialisierte Speicherblöcke, die du dann als Objekt anzusprechen versuchst. (und was bei diesem Versuch herauskommt, kann dir niemand garantieren)
PS: Und in der Regel basiert die new/delete Speicherverwaltung intern auch wieder auf malloc/free - damit erübrigt sich das Thema, wer denn nun den Speicher zurückbekommt.
(und spätestens wenn das Programm beendet wird, holt sich das Betriebssystem den Speicher zurück)
-
Saraneus schrieb:
Ist es möglich, mit malloc eine Klasse zu instanziieren?
Nein. malloc ruft keine ctors auf.
Saraneus schrieb:
Wie verhält sich der Einsatz von new generell zu malloc?
In C nimmst du malloc, in C++ new bzw new[ ]
Saraneus schrieb:
Ich habe in einem anderen Beitrag erfahren, dass delete den Speicher nicht mehr ans Betriebssystem freigibt, sondern lediglich ans Programm.
Wo willst du was erfahren haben!?
greetz, Swordfish
[edit]zu spät *argl*[/edit]
-
CStoll schrieb:
Und in der Regel basiert die new/delete Speicherverwaltung intern auch wieder auf malloc/free - damit erübrigt sich das Thema, wer denn nun den Speicher zurückbekommt.
Kann man dieses Verhalten beim Kompilieren (mit Compileroptionen) beeinflussen? Denn new/delete gibt Speicher laut "top" definitiv nicht mehr ans System zurück, allenfalls ans Programm. Wenn ich mit malloc/free arbeite, kann ich live sehen, wie Speicher ans System zurückgegeben wird.
Swordfish schrieb:
Wo willst du was erfahren haben!?
Wo: http://www.c-plusplus.net/forum/viewtopic-var-t-is-180533.html
Was: siehe letzten Beitrag:Mr. N schrieb:
Saraneus schrieb:
Folgende Version funktioniert aber, d.h. "top" spuckt beim Speicherverbrauch immer 0.1% aus.
IrgendeineKlasse *instanz; while(1) { instanz = new IrgendeineKlasse(0); delete instanz; }Weil er ja das gelöschte wiederverwenden kann. Es wird freigegeben, allerdings nur innerhalb des Programms.
-
Da Du mit top arbeitest nutzt Du vermutlich Linux. Hier greifen die operatoren new und delete definitiv auf malloc und free zurück, was man auch in Stacktraces des Debuggers gdb sehen kann. Beide sollten sich also nicht grundsätzlich anders verhalten.
Ansonsten würde ich an Deiner Stelle dort mehr dem Betriebssystem bzw. der Speicherverwaltung der C(++)-Bibliothek vertrauen. <edit>Gründe dafür führt Simon2 unten auf</edit>. Sollte es wirklich stichhaltige Gründe geben, new und delete mittels malloc und free nachbauen zu müssen, kannst Du IMHO gleich die ganze Bibliothek wegschmeissen. Kann ich mir wie gesagt aber nicht vorstellen.
-
Hi,
ich glaube, das hat nicht unbedingt etwas mit der Programmiersprache zu tun, sondern entweder mit der konkreten Runtimelib oder (wahrscheinlicher) mit dem Betriebssystem; das entscheident ziemlich autonom, wann es wie Speicher wieder für andere Anwendungen freigibt.
Da spielen dann u.A. mit rein, wieviel Speicher insgesamt noch frei ist, was das OS denkt, wer den Speicher demnächst brauchen könnte, etc. ...
Üblicherweise werden Betriebssystem aktiver, sobald der Speicher knapp wird und nicht vorher (kostet nur unnötig Performance).
Du hast als User nicht allzuviele Möglichkeiten .... brauchst es aber auch einfach nicht !Gruß,
Simon2.
-
Saraneus schrieb:
CStoll schrieb:
Und in der Regel basiert die new/delete Speicherverwaltung intern auch wieder auf malloc/free - damit erübrigt sich das Thema, wer denn nun den Speicher zurückbekommt.
Kann man dieses Verhalten beim Kompilieren (mit Compileroptionen) beeinflussen? Denn new/delete gibt Speicher laut "top" definitiv nicht mehr ans System zurück, allenfalls ans Programm. Wenn ich mit malloc/free arbeite, kann ich live sehen, wie Speicher ans System zurückgegeben wird.
Wenn du unbedingt dem System ins Handwerk pfuschen willst, kannst du gerne 'operator new' und 'operator delete' überschreiben, um deine eigene Speicherverwaltung einzubauen. Aber wie Simon und LordJaxom schon sagten, weiß dein System vermutlich besser als du, wann es mehr Speicher anfordern sollte.
Swordfish schrieb:
Wo willst du was erfahren haben!?
Wo: http://www.c-plusplus.net/forum/viewtopic-var-t-is-180533.html
Was: siehe letzten Beitrag:Mr. N schrieb:
Saraneus schrieb:
Folgende Version funktioniert aber, d.h. "top" spuckt beim Speicherverbrauch immer 0.1% aus.
IrgendeineKlasse *instanz; while(1) { instanz = new IrgendeineKlasse(0); delete instanz; }Weil er ja das gelöschte wiederverwenden kann. Es wird freigegeben, allerdings nur innerhalb des Programms.
Das hat doch auch seine Vorteile - andere Programme brauchen den Speicher im Moment eh nicht (wenn doch, wird das System dem Heap-Manger schon auf die Schultern klopfen) und solange der Heap-Manager genug Reserven für deine Anforderungen hat, muß er das System nicht um neue Zuteilungen bitten.
-
Einfache Regel: Nimm kein malloc/free in C++. Denk dran. C++ ist eine eigene Programmiersprache und keine neue Version von C. Was in C gut war, ist in C++ schlecht etc.
Wenn du C++ lernen willst, dann vergiss C.
Saraneus schrieb:
Swordfish schrieb:
Wo willst du was erfahren haben!?
Wo: http://www.c-plusplus.net/forum/viewtopic-var-t-is-180533.html
Was: siehe letzten Beitrag:Mr. N schrieb:
Saraneus schrieb:
Folgende Version funktioniert aber, d.h. "top" spuckt beim Speicherverbrauch immer 0.1% aus.
IrgendeineKlasse *instanz; while(1) { instanz = new IrgendeineKlasse(0); delete instanz; }Weil er ja das gelöschte wiederverwenden kann. Es wird freigegeben, allerdings nur innerhalb des Programms.
Das macht ja nichts. Du darfst reservierten Speicher eben nicht als feste Page im RAM ansehen. Dafür gibt es ja Paging...
(btw. gilt das gleiche für malloc/free)
-
Saraneus schrieb:
Ist es möglich, mit malloc eine Klasse zu instanziieren? Wie verhält sich der Einsatz von new generell zu malloc? Ich habe in einem anderen Beitrag erfahren, dass delete den Speicher nicht mehr ans Betriebssystem freigibt, sondern lediglich ans Programm. Da ich von C auf C++ umsteige, stört mich das etwas. Wie geht ihr mit dieser Tatsache (?) um?
Bei malloc ist das genauso.
-
Allerdings kein Grund, eine Antwort schuldig zu bleiben:
MyClass *p = malloc(sizeof(MyClass)); new (p) MyClass; // <- hier wird der Konstruktor aufgerufen, trickreich, trickreich ... p->~MyClass(); free(p);
-
Mr. N at work schrieb:
MyClass *p = malloc(sizeof(MyClass)); new (p) MyClass; // <- hier wird der Konstruktor aufgerufen, trickreich, trickreichJa, aber eben nicht per 'malloc'. Wahr ist hier natürlich, dass man Allokation von Instanzierung entkoppelt.