Simple, Exceptionsichere und bequeme Allokation von Objekten

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Hallo,
mal als Anregung für einige Leute hier. Es macht das coden einfach bequemer und verhindert Memory-Leaks.

http://www.python-forum.de/pastebin.php?mode=view&s=125

Gruß
Grüßle.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Gibt es überhaupt Personen die mit C++ arbeiten und diesen Trick nicht kennen? Zumindest das "IsValid", aber wahrscheinlich auch das "Get" würde ich noch die Operator-Überladung anpassen.

Sebastian
Das Leben ist wie ein Tennisball.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Hi,
ich kenne zumindest einige, die C und C++ mischen und deshalb nicht so viel Ahnung davon haben.

Mal aus Interesse: Wie genau würdest du das mit der Überladung machen? Für ``Get`` kann man ja operator->* nehmen (afaik), und was machst du für ``IsValid``?

Gruß
Grüßle.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Bei dem "IsValid" könnte dir das Safe Bool Idiom helfen. Dort sind auf drei Seiten diverse Möglichkeiten mit ihren Vor- und Nachteilen aufgelistet. Beim "Get" würde ich ebenfalls zu -> und * greifen.

Sebastian
Das Leben ist wie ein Tennisball.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Cool, ich wusste nicht, dass es einen operator! und einen operator bool gibt. :o

Danke für den Hinweis.
Grüßle.
lunar

@Chrisber: Das ist kein "Trick", sondern ein übliches C++-Idiomen, welches man kennen sollte, meines Erachtens sogar kennen muss, bevor man produktiv genutzte C++-Programme schreiben möchte. Insbesondere sollte man es richtig kennen, Deine Implementierung ist nicht vollständig, es fehlen Kopierkonstruktor und Zuweisungsoperator.

Folglich erzeugt der Compiler implizit Standardkopierkonstruktor und Standardzuweisungsoperator, die eine attributweise Kopie durchführen. Dadurch wird der Referenzzähler bei Zuweisung und Kopie nicht aktualisiert, so dass Speicherlecks noch immer möglich sind, außerdem können hängende Referenzen entstehen. Kopierkonstruktor und Zuweisungsoperator müssen also entweder privat sein, oder sinnvoll implementiert werden. Zudem könnte man neben den schon erwähnten Operatoren auch den Konvertierungsoperator für "PyObject*" überladen, dann nämlich kann man ein solches Objekt direkt an C-Funktionen übergeben, die "PyObject*" erwarten.

Auch finde ich die Implementierung unglücklich. Die Semantik des Objekts wäre besser, wenn es im Normalfall keine Referenzen stehlen würde, sprich, wenn der Konstruktor selbst den Referenzzähler erhöhen würde. Meine Implementierung zeigt, was ich meine. Die Implementierung ist schnell zusammengeschrieben, ist daher ungetestet und kann ihrerseits fehlerhaft sein. Man möge es mir bitte nachsehen :)

Das ist auch eigentlich kein "Trick", sondern ein völlig übliches C++-Idiom, welches man eigentlich kennen sollte, bevor man produktiv C++ programmieren möchte.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Ich habe es nie als Trick bezeichnet. Trotzdem danke für die Anregungen. Meine Implementation war auch nur schnell hingeklatscht, da mir das gerade in den Sinn gekommen ist.

Gruß
Grüßle.
Antworten