Generell gilt es ja als guter Stil, in C++ immer new statt malloc zu verwenden, auch wenn es nicht um Objekte, sondern um primitive Typen geht, immerhin könnte ja mal wer auf die Idee kommen und den new-operator zu überladen und plötzlich müsste man den malloc-Code per Hand anpassen.
Ich habe hier nun den Sonderfall, dass eine C++ Bibliothek Daten auf den Heap anlegt und diese an eine C-Bibliothek weiterreicht und umgekehrt auch für der C-lib allozierte Daten bekommt. Die C-Bibliothek hat nun aus diversen Gründen ein recht unsauberes Speichermanagement, sprich, teilweise muss die Bibliothek der aufrufenden Funktion Speicher allozieren und die der aufgerufenen gibt ihn wieder frei, teilweise andersherum.
Kann ich den C++ Code hier überhaupt problemlos new verwenden lassen?
Wenn irgendwer mal den new-operator global mit einem nicht zu malloc kompatiblen Speichermanagement überlädt, dann habe ich doch auch bei primitiven Typen ein ernsthaftes Problem, wenn new mit free und malloc mit delete freigegeben wird?
new vs. malloc in C++ Code, für an C-Code weiterzugebendes
-
- Establishment
- Beiträge: 467
- Registriert: 18.04.2002, 15:31
new vs. malloc in C++ Code, für an C-Code weiterzugebendes
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da :)
"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
DirectGL, endlich ist es da :)
"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: new vs. malloc in C++ Code, für an C-Code weiterzugebend
Auch in diesem Fall gilt wie immer: Speicher IMMER mit derselben API freigeben, mit der er reserviert wurde. Überlässt dir eine Bibliothek einen Speicherbereich, welcher mit malloc angefordert wurde, so ist die EINZIG richtige Lösung, diesen mit free freizugeben. Übernimmt eine Bibliothek die Inhaberschaft eines Speicherbereichs, den sie später mit free freigeben wird, so ist die EINZIG richtige Lösung, diesen von vorneherein mit malloc anzufordern.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
-
- Establishment
- Beiträge: 191
- Registriert: 01.03.2009, 19:22
- Echter Name: David N.
Re: new vs. malloc in C++ Code, für an C-Code weiterzugebend
Wie CodingCat völlig richtig gesagt hat, ist die einzige Option, genau den gleichen Speichermanager wie die C-Bibliothek – ansonsten bekommst du gröbere Probleme, wenn du jemals einen anderen Allocator einsetzen solltest.
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: new vs. malloc in C++ Code, für an C-Code weiterzugebend
Vergiss auch nicht, dass du new mit zusätzlichen Parametern überladen kannst. Also z.B. new (LibraryXYZBound) LibClass(); – dann ist es wumpe, wer operator new (ohne zusätzliche Parameter) überschreibt.
- Aramis
- Moderator
- Beiträge: 1458
- Registriert: 25.02.2009, 19:50
- Echter Name: Alexander Gessler
- Wohnort: 2016
- Kontaktdaten:
Re: new vs. malloc in C++ Code, für an C-Code weiterzugebend
Es muss nicht nur der gleiche Speichermanager sein, sondern sogar derselbe.
Wenn du oder die externe C-Lib statisch gegen ihre Runtime linken, hat jeder von euch einen eigenen Heap und eine eigene Heap-Verwaltung. Wenn du also dein free() aufrufst um einen von einem fremen malloc allozierten Speicherblock freizugeben … nunja, es koennt wehtun. Bei dynamischer Linkage (oder wenn die C-Lib statisch einkompiliert wird), besteht dieses Problem nicht.
… aber trotzdem: aus genau diesem Grund sind strikte Ownership-Semantiken Pflicht fuer C/C++ Bibliotheken die den Anspruch erheben, tatsaechlich praktisch einsetzbar zu sein :-)
Wenn du oder die externe C-Lib statisch gegen ihre Runtime linken, hat jeder von euch einen eigenen Heap und eine eigene Heap-Verwaltung. Wenn du also dein free() aufrufst um einen von einem fremen malloc allozierten Speicherblock freizugeben … nunja, es koennt wehtun. Bei dynamischer Linkage (oder wenn die C-Lib statisch einkompiliert wird), besteht dieses Problem nicht.
… aber trotzdem: aus genau diesem Grund sind strikte Ownership-Semantiken Pflicht fuer C/C++ Bibliotheken die den Anspruch erheben, tatsaechlich praktisch einsetzbar zu sein :-)
-
- Establishment
- Beiträge: 467
- Registriert: 18.04.2002, 15:31
Re: new vs. malloc in C++ Code, für an C-Code weiterzugebend
Interessant, wusste ich gar nicht ,dass man da Parameter übergeben kann.Krishty hat geschrieben:Vergiss auch nicht, dass du new mit zusätzlichen Parametern überladen kannst. Also z.B. new (LibraryXYZBound) LibClass(); – dann ist es wumpe, wer operator new (ohne zusätzliche Parameter) überschreibt.
Gut, dass die C Lib statisch in die C++ Lib einkompiliert wird, das kann ein Spaß werden, wenn sich das mal ändern sollte. Habe da schon viel Arbeit reingesteckt, das quasi nicht vorhandene Speichermanagement aller "wer zuerst drauf zugreift, alloziert den Kram, wer zuletzt drauf zugreift, gibt ihn frei, aber nirgends steht, wer wann zuständig ist und wer den Kram wie lange braucht, wer wann davon ausgeht, dass er ihn freigeben kann, usw." auf Vordermann zu bringen, aber das ist irgendwie eine unendliche Geschichte., man findet doch immer wieder was...Aramis hat geschrieben:Es muss nicht nur der gleiche Speichermanager sein, sondern sogar derselbe.
Wenn du oder die externe C-Lib statisch gegen ihre Runtime linken, hat jeder von euch einen eigenen Heap und eine eigene Heap-Verwaltung. Wenn du also dein free() aufrufst um einen von einem fremen malloc allozierten Speicherblock freizugeben … nunja, es koennt wehtun. Bei dynamischer Linkage (oder wenn die C-Lib statisch einkompiliert wird), besteht dieses Problem nicht.
… aber trotzdem: aus genau diesem Grund sind strikte Ownership-Semantiken Pflicht fuer C/C++ Bibliotheken die den Anspruch erheben, tatsaechlich praktisch einsetzbar zu sein :-)
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da :)
"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
DirectGL, endlich ist es da :)
"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]