OOP mit ANSI C
-
-fricky- schrieb:
Nicht wirklich schrieb:
erzähl mir doch mal wie man [in C] einen Smartpointer implementiert...
was soll das sein? wofür ist das gut?
Smartpointer sind wohl eine der großen Erleichterungen für den Programmierer, die es unter andrem in C++ gibt und nur durch Objektorientierung möglich ist. Sie sorgen dafür, dass dynamisch allokierter Speicher automatisch freigegeben werden wenn sie aus dem Scope fallen.
Ansonsten: http://www.c-plusplus.net/forum/viewtopic-var-t-is-134971.html
-
habs gerade gelesen: http://en.wikipedia.org/wiki/Smart_pointer
ist also sowas wie 'ne 'garbage collection für arme' und leute, die free() gerne mal vergessen. naja,...
-
Tja, bei den vielen Sicherheitslücken und sonstigen Problemen, von denen man tagtäglich lesen kann, vergessen das ziemlich viele Leute. Aber die haben natürlich alle keine Ahnung...
-
Hab' ich heute schonmal geschrieben: Bei Funktionen mit multiple exits fängt es an, problematisch zu werden, bei jedem möglichen Ausgang an alle frees zu denken. Lässt sich aber durch diverse Techniken noch erreichen. Eklig wird's bei Exceptions, bei denen man das throw nicht zwangsläufig sieht, weil es in einer anderen Funktion versteckt sein kann, die man aufruft.
-
Tachyon schrieb:
Tja, bei den vielen Sicherheitslücken und sonstigen Problemen, von denen man tagtäglich lesen kann, vergessen das ziemlich viele Leute. Aber die haben natürlich alle keine Ahnung...
ein fehlendes 'free' ist doch meistens schnell gefunden. falsche anwendung solcher 'smart pointers' produziert bestimmt schwieriger zu lokalisierende bugs. ich hab nichts gegen echte garbage collection, aber sowas, weder halbes noch ganzes, wie diese 'smart pointers', ist doch irgendwie mist.
btw, was ich besser finden würde, wäre eine funktion, die den ganzen heap resettet, also ein manueller GC.
-
Diese schwieriger zu findenden Bugs können IMHO eigentlich nur aus Ringreferenzen resultieren, und die kann man mit echten GC-Sprachen auch erreichen.
-
LordJaxom schrieb:
Diese schwieriger zu findenden Bugs können IMHO eigentlich nur aus Ringreferenzen resultieren
oder wenn man den falschen typ wählt. in dem wiki-artikel steht:
Several types of smart pointers exist. Some work with reference counting, others assigning ownership of the object to a single pointer
die verhalten sich alle anders. um ein ziemlich simples problem, nämlich vergessene 'free()' zu beseitigen, halst man sich einen haufen anderer, potenzieller probleme auf, die viel schwieriger zu entdecken sind. das kann's doch irgendwie nicht sein.
LordJaxom schrieb:
und die kann man mit echten GC-Sprachen auch erreichen.
aber nur sehr schwer bis garnicht. moderne GCs können rausfinden, wenn zwei oder mehr objekte nur noch sich selbst referenzieren.
-
Du hast doch überhaut keine Ahnung wie sich ein Smartpointer in der Praxis verhält, also urteile nicht über Dinge die deinen Horizont übersteigen.
Übrigens hat ein Smartpointer wenig mit OOP zu tun, denn ein Smartpointer lässt sich in jeder Sprache implementieren die RAII unterstützt, Java tut es beispielsweise nicht (deshalb mag fricky die Smartpointer nicht) und trotzdem ist Java OOP..
-
hdf ficky schrieb:
Du hast doch überhaut keine Ahnung wie sich ein Smartpointer in der Praxis verhält, also urteile nicht über Dinge die deinen Horizont übersteigen.
Da geb ich dir recht und anscheinend hat er auch nicht viel programmier erfahrung, sonst wüsste er wie schwer solche fehler zu finden sind. Und Nein! Smartpointer verursachen sicher nicht schwerwiegendere Probleme.
hdf ficky schrieb:
Übrigens hat ein Smartpointer wenig mit OOP zu tun, denn ein Smartpointer lässt sich in jeder Sprache implementieren die RAII unterstützt, Java tut es beispielsweise nicht (deshalb mag fricky die Smartpointer nicht) und trotzdem ist Java OOP..
Doch er hat viel mit OOP zu tun, nur hat Java eben einen GC und benötigt deswegen schlicht und ergreifend das RAII konzept nicht. Ich bezog mich mit meiner Aussage: "Ohne OOP keine Smartpointer" nur auf Sprachen die ohne GC arbeiten müssen, da dort eben das RAII Konzept gebraucht wird.
-
Jeah, wieder mal ein Thread mit den zielsichersten Definitionen von OOP
-
Nicht wirklich schrieb:
...und anscheinend hat er auch nicht viel programmier erfahrung, sonst wüsste er wie schwer solche fehler zu finden sind.
mag sein, aber bisher habe ich noch jedes fehlende free() durch scharfes hingucken gefunden.
Nicht wirklich schrieb:
Und Nein! Smartpointer verursachen sicher nicht schwerwiegendere Probleme.
aber vor den wirklichen problemen mit malloc/free, nämlich dass man über den zugewiesenen bereich hinaus zugreifen kann, oder dass manche auch ganz gern vergessen, den rückgabewert von malloc() auf 0 zu prüfen, schützt einen auch kein 'smart pointer'.
Nicht wirklich schrieb:
Ich bezog mich mit meiner Aussage: "Ohne OOP keine Smartpointer" nur auf Sprachen die ohne GC arbeiten müssen, da dort eben das RAII Konzept gebraucht wird.
ach herrje, C hat auch keinen GC und kommt ohne 'RAII' (was immer das sein soll) aus. ihr stellt wirklich kuriose behauptungen auf.
-
Nicht wirklich schrieb:
So ist das so??? Wenn OO in C kein Problem wäre, erzähl mir doch mal wie man einen Smartpointer implementiert, wie man in C vererben kann oder man die Daten vernünftig kapselt.
Smartpointer gibt es in der OOP Definition nicht. Es ist ein Idiom um RAII zu benutzen (ein anderes Idiom).
Dir fehlt jede Grundlage um hier vernünftig zu diskutieren.
Kapselung, siehe FILE*
Vererbung hat nichts mit OOP zu tungenau das meine ich mit Java OOP.
-
-fricky- schrieb:
Nicht wirklich schrieb:
...und anscheinend hat er auch nicht viel programmier erfahrung, sonst wüsste er wie schwer solche fehler zu finden sind.
mag sein, aber bisher habe ich noch jedes fehlende free() durch scharfes hingucken gefunden.
Entscheidend ist, dass es fehlen konnte und du suchen musstest.
-fricky- schrieb:
Nicht wirklich schrieb:
Und Nein! Smartpointer verursachen sicher nicht schwerwiegendere Probleme.
aber vor den wirklichen problemen mit malloc/free, nämlich dass man über den zugewiesenen bereich hinaus zugreifen kann, oder dass manche auch ganz gern vergessen, den rückgabewert von malloc() auf 0 zu prüfen, schützt einen auch kein 'smart pointer'.
Und Crysis kann man damit auch nicht spielen.
-
Shade Of Mine schrieb:
Nicht wirklich schrieb:
So ist das so??? Wenn OO in C kein Problem wäre, erzähl mir doch mal wie man einen Smartpointer implementiert, wie man in C vererben kann oder man die Daten vernünftig kapselt.
Smartpointer gibt es in der OOP Definition nicht. Es ist ein Idiom um RAII zu benutzen (ein anderes Idiom).
Dir fehlt jede Grundlage um hier vernünftig zu diskutieren.
Kapselung, siehe FILE*
Vererbung hat nichts mit OOP zu tungenau das meine ich mit Java OOP.
Okay, das ist einfach albern! Vererbung hat nichts mit OOP zu tun? Das ist einer der zentralen Aspekte der Objektorientierung. Siehe: http://de.wikipedia.org/wiki/Objektorientierung#Vererbung
-
camper schrieb:
-fricky- schrieb:
Nicht wirklich schrieb:
...und anscheinend hat er auch nicht viel programmier erfahrung, sonst wüsste er wie schwer solche fehler zu finden sind.
mag sein, aber bisher habe ich noch jedes fehlende free() durch scharfes hingucken gefunden.
Entscheidend ist, dass es fehlen konnte und du suchen musstest.
Sehr richtig und genau da setzen nunmal die Smart Pointer an.
-fricky- schrieb:
Nicht wirklich schrieb:
Und Nein! Smartpointer verursachen sicher nicht schwerwiegendere Probleme.
aber vor den wirklichen problemen mit malloc/free, nämlich dass man über den zugewiesenen bereich hinaus zugreifen kann, oder dass manche auch ganz gern vergessen, den rückgabewert von malloc() auf 0 zu prüfen, schützt einen auch kein 'smart pointer'.
Und Crysis kann man damit auch nicht spielen.[/quote][/quote]
Eben. Es hat nichts mit dem RAII-Konzept zu tun ob du über irgendwas hinausschreiben kannst. Außerdem wird bei C++ wenn new keinen Speicher erfolgreich anfordern konnte, eine entsprechende Exception geworfen. Dabei bin ich mir aber nicht ganz sicher und hat wie gesagt nichts mit dem Thema zu tun
-
camper schrieb:
-fricky- schrieb:
Nicht wirklich schrieb:
...und anscheinend hat er auch nicht viel programmier erfahrung, sonst wüsste er wie schwer solche fehler zu finden sind.
mag sein, aber bisher habe ich noch jedes fehlende free() durch scharfes hingucken gefunden.
Entscheidend ist, dass es fehlen konnte und du suchen musstest.
aber ich denke, dass ein fehler aufgrund falscher anwendung von 'smart-pointern' viel schwerer zu finden ist. das sind dann fehler von der kategorie: 'sieht alles richtig aus, funzt aber nicht'.
-
Nicht wirklich schrieb:
Okay, das ist einfach albern! Vererbung hat nichts mit OOP zu tun? Das ist einer der zentralen Aspekte der Objektorientierung.
shady hat recht. vererbung ist keine bedingung für OO. nur nützliches beiwerk.
-
-fricky- schrieb:
[...]aber ich denke[...]
Denke nicht. Schau es Dir lieber mal genau an.
Ohne Vererbung keine OOP. Man kann bestenfalls objektbasiert programmieren. Das ist ein kleiner aber feiner Unterschied, der dem guten Shade aber leider nicht so recht einleuchten möchte.
-
Tachyon schrieb:
-fricky- schrieb:
[...]aber ich denke[...]
Denke nicht.
So weit würde ich nicht gehen. Das Problem in diesem Fall ist wohl eher, dass es sich nur um "Eine Redewendung, die zu hassen wäre" handelt und eben nicht um eine der Wahrheit entsprechende Tatsachenbehauptung.
-
poasting in an oop-with-c thread
edit: kann man dafür nicht ein extra forum anlegen? an diskussionstoff soll's nicht mangeln