Segmentation fault beim Zugriff auf polymorphes Object

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Segmentation fault beim Zugriff auf polymorphes Object

Beitrag von Bebu » Di Nov 02, 2010 10:34 pm

Xin hat geschrieben: Moment... lies, was Du da schreibst. Wenn Du einem bestehendem Objekt einen Basispointer zuweisen willst, hast Du schon im Konzept etwas falsch gemacht. Das ist als würdest Du eine Stadt mit einem Wegweiser gleichsetzen. Ein Wegweiser ist aber keine Stadt.

Weiterhin hast Du einen Pointer, den Du nicht initialisiert hast. Du hast also nur einen Wegweiser, der ins nichts zeigt. Und nur weil Du dann eine Stadt ins Nirwana schickst, hast Du den Wegweiser nicht beschriftet.
Es sollte ja auch nicht so werden, in dem Fall habe ich versucht durch try and error auf die Lösung zu kommen. Die scheinbare Lösung, hat sich nun auch als Error entpuppt. Ich muss mir das mit den Zeigern wieder ansehen, ein paar Wochen nichts programmiert und schon vergesse ich manche Details wieder. :?
Xin hat geschrieben: Du musst den Pointer auf das Objekt initialisieren, statt das Objekt ins Nirwana zu kopieren, wo der Pointer derzeit hinzeigt.

Code: Alles auswählen

basepointer = &IntegerObject;
(ich habe den Code jetzt nicht hier, um die Namen der Variablen anzupassen)
Besten Dank, genau das ist die Lösung die ich suche, auch wenn es eigentlich ganz banal ist.
Xin hat geschrieben:
Bebu hat geschrieben:Gibt es eigentlich eine Möglichkeit zur Laufzeit zu überprüfen, ob ein Zeiger auf eine gültige Adresse zeigt? Damit meine ich keine Überprüfung, ob der Zeiger auf NULL zeigt.
Gibt es eine Möglichkeit in der Realität zu überprüfen, ob ein Wegweiser in die Richtung zeigt, wie er beschriftet ist?

Natürlich gibt es sie. Wenn Du ein GPS-Gerät hast, um Deine Position zu bestimmen, einen Kompass, eine Karte und ein Lineal, um die Richtung von Deiner Position aus in die Karte einzutragen, dann kannst Du das vor Ort überprüfen. Das geht in C++ natürlich auch - sogar automatisiert.
Du kannst operator new und operator delete überschreiben und bei new die Adresse in eine Liste eintragen und bei delete die Adresse aus der Liste entnehmen. Die Liste kannst Du dann fragen, ob Du Zugriff auf eine Adresse hast.
Das ist aufwendig - es kostet Zeit und deswegen macht es keiner. Man vertraut einfach darauf, dass niemand den Wegweiser verdreht hat.
Klingt auf alle Fälle nach einer interessanten Möglichkeit. Nach dem ich mich sowieso noch nicht mit Operatorenüberladung und Überschreibung beschäftigt habe, wäre es mal ganz interessant sowas zu schreiben. Ist vielleicht in einer Testsuite verwertbar, um zu überprüfen ob dynamisch angeforderter Speicher auch wieder freigegeben wurde. Welche Möglichkeiten gibt es sonst noch so, eine Programm auf Speicherlecks zu überprüfen?
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Segmentation fault beim Zugriff auf polymorphes Object

Beitrag von Bebu » So Nov 07, 2010 11:22 pm

Also, ich habe mich jetzt ausreichend mit dem überladen von new und delete beschäftigt und weiß jetzt auch, warum von allen Seiten empfohlen wird, die Finger davon zu lassen, diese beiden Operatoren global zu überschreiben :? Man könnte sagen, das ich kläglich gescheitert bin. Gibt es irgendwo eine Möglichkeit nachzusehen, wie diese Operatoren genau implementiert sind? Ich habe gesucht, aber nichts gefunden. Wenn man weiß, wie die Originale Arbeiten, kann man leichter was nachbauen und ergänzen.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Segmentation fault beim Zugriff auf polymorphes Object

Beitrag von Dirty Oerti » So Nov 07, 2010 11:31 pm

Tag :)

Also. Ich habe immerhin mal den Header gefunden, in dem new deklariert wird.
Diese Deklaration befindet sich bei mir in /usr/include/c++/4.4.5/new

Dabei handelt es sich natürlich nur um die Deklaration, also nichts, was dir groß weiterhelfen dürfte.
Allerdings deutet das für mich darauf hin, dass du die exakte Implementierung wohl im Source Code des g++ suchen solltest.

"Quellen"
http://www.daniweb.com/forums/thread13103.html
http://en.wikipedia.org/wiki/New_%28C%2B%2B%29
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Segmentation fault beim Zugriff auf polymorphes Object

Beitrag von Xin » Mo Nov 08, 2010 8:54 am

Bebu hat geschrieben:Also, ich habe mich jetzt ausreichend mit dem überladen von new und delete beschäftigt und weiß jetzt auch, warum von allen Seiten empfohlen wird, die Finger davon zu lassen, diese beiden Operatoren global zu überschreiben :?
Solange es nur einer macht, sehe ich da jetzt nicht das Problem. Du solltest es als Lib nicht verlangen, weil es sonst der User nicht mehr überladen kann. Ansonsten kannst Du Deine Erfahrungen hier beschreieben: http://www.proggen.org/doku.php?id=cpp:operator:memory
Bebu hat geschrieben:Man könnte sagen, das ich kläglich gescheitert bin. Gibt es irgendwo eine Möglichkeit nachzusehen, wie diese Operatoren genau implementiert sind? Ich habe gesucht, aber nichts gefunden. Wenn man weiß, wie die Originale Arbeiten, kann man leichter was nachbauen und ergänzen.
Soweit ich weiß ruft new lediglich malloc() und delete free().
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Segmentation fault beim Zugriff auf polymorphes Object

Beitrag von Dirty Oerti » Mo Nov 08, 2010 7:02 pm

Xin hat geschrieben:Soweit ich weiß ruft new lediglich malloc() und delete free().
Im Prinzip ja.
Nach allem, was ich bisher gelesen habe kommt nur noch der Code dazu, der die Rückgabewerte überprüft und bei Bedarf eine Exception wirft...
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Segmentation fault beim Zugriff auf polymorphes Object

Beitrag von Xin » Mo Nov 08, 2010 8:11 pm

Dirty Oerti hat geschrieben:
Xin hat geschrieben:Soweit ich weiß ruft new lediglich malloc() und delete free().
Im Prinzip ja.
Nach allem, was ich bisher gelesen habe kommt nur noch der Code dazu, der die Rückgabewerte überprüft und bei Bedarf eine Exception wirft...
Stimmt, bei aktuellen Implementationen. Wenn man darauf verzichten will (will ich), dann gibt's aber noch "new( std::nothrow ) <type>"

Muss ich glatt mal schauen, dass ich das auch im Wiki habe... mit der std::Lib müssen wir auch irgendwann mal anfangen. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten