new vs. malloc in C++ Code, für an C-Code weiterzugebendes

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

new vs. malloc in C++ Code, für an C-Code weiterzugebendes

Beitrag von kaiserludi »

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?
"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]
Benutzeravatar
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

Beitrag von CodingCat »

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
klickverbot
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

Beitrag von klickverbot »

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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
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

Beitrag von Krishty »

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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
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

Beitrag von Aramis »

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 :-)
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: new vs. malloc in C++ Code, für an C-Code weiterzugebend

Beitrag von kaiserludi »

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.
Interessant, wusste ich gar nicht ,dass man da Parameter übergeben kann.
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 :-)
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...
"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]
Antworten