Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 16

Thema: [C/C++] Herausfinden ob Pointer auf etwas brauchbares pointet

  1. #1
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549

    [C/C++] Herausfinden ob Pointer auf etwas brauchbares pointet

    Hallo,

    wenn ich einen Pointer habe (von irgendwo her) wie finde ich dann raus ob der auf etwas brauchbares zeigt?
    Ich möchte nicht dass mein Programm gleich segfaulted nur weil irgendwer einer Methode einen Pointer übergibt der nicht "brauchbar" ist.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  2. #2
    Registrierter Benutzer
    Registriert seit
    27.04.2001
    Beiträge
    62
    IMHO kannst du ihn beim loeschen nur auf NULL (C) oder 0 (C++) setzen und dann vor der Verwendung halt auf NULL/0 pruefen. Ansonsten kann man nicht rausfinden ob ein Pointer noch gueltig ist oder nicht.

    Aber vielleicht weiss ja jemand anderes noch was.

  3. #3
    Registrierter Benutzer
    Registriert seit
    27.04.2001
    Beiträge
    62
    Achja:
    Bei Qt gibt es z.B. einen QGuardedPtr der sich automatisch auf 0 setzen soll, wenn er geloescht wird: http://doc.trolltech.com/3.3/qguardedptr.html

    Ich hab damit noch nichts gemacht, aber vielleicht kann man sich sowas fuer C++ selber bauen, wenn man nicht Qt verwendet.

    Aber da koennen vielleicht die Qt-Experten mehr dazu sagen.

    Code:
    QGuardedPtr<QLabel> label = new QLabel( 0, "label" );
    label->setText( "I like guarded pointers" );
    
    delete (QLabel*) label; // simulate somebody destroying the label
    
    if ( label)
       label->show();
    else
       qDebug("The label has been destroyed");

  4. #4
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    [ Vorsicht: Viel Meinung, wenig Fakten voraus! :-) ]

    Ich möchte nicht dass mein Programm gleich segfaulted nur weil irgendwer einer Methode einen Pointer übergibt der nicht "brauchbar" ist.
    Vielleicht ist es dann besser, deine Schnittstellen so zu verändern, dass keine Pointer, sondern beispielsweise Referenzen übergeben werden. Spätestens mit diesem Schritt sollte es für die Benutzer dann hinreichend deutlich gemacht sein, das nur gültige Verweise übergeben werden dürfen. Unabhängig von diesem Schritt würde ich mich aber trotzdem darauf verlassen, das Nicht-Null Pointer auch tatsächlich auf gültige Objekte verweisen. Sieh es mal so: Wenn ein Benutzer einen solch gravierenden Fehler macht, einen ungültigen (Nicht-Null) Zeiger zu übergeben, wie willst du dann darauf noch sinnvoll reagieren? Natürlich kann man auf dem Standpunkt stehen, das ein kontrollierter Programmabruch einem unkontrolliertem vorzuziehen ist. Andererseits kann man sich einfach nicht vor jedem Fehler durch Verhältnissmäßigem Aufwand schützen. Und in jeder Funktion noch potentiell aufwändige Checks durchzuführen, ob ein Zeiger gültig ist, obwohl das Einhalten dieser Bedingung eigentlich für den Benutzer viel einfacher sicherzustellen ist, das ist meiner Meinung nach unverhältnismäßig.

    Dann lieber von vornherein "sichere" Schnittstellen verwenden: auto_ptr, smart pointer, Referenzen, "Keine Zeiger", usw...

    Naja, das ist nur meine Meinung, ich kann und will deinen Entscheidungen natürlich nicht vorgreifen.

  5. #5
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    @all: Danke für die Antworten.

    @locus vivendi: Es ist ja nicht so dass sich das Programm zwingend beenden müsste - das ist eher der Punkt. Ich meine wenn es sich sowieso beendet kommts (meist) nicht so drauf an - aber wenns sonst weiterlaufen könnte ists schon was anderes.

    Da muss ich also mehr oder weniger darauf vertrauen dass ich was brauchbares kriege. Ich meine in Java würde man einfach die entsprechende Exception abfangen...

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  6. #6
    Registrierter Benutzer Avatar von r00t043
    Registriert seit
    11.01.2004
    Beiträge
    38
    IMHO kannst du unter Linux den Segfault verhindern, indem du nicht auf Addressen >= 0xC0000000 zugreifst, denn ab da faengt ( meistens ) der Spielplatz des Kernels an und der mag es nicht wenn du dich dahin verirrst.

  7. #7
    Registrierter Benutzer
    Registriert seit
    27.04.2001
    Beiträge
    62
    Zitat Zitat von r00t043
    IMHO kannst du unter Linux den Segfault verhindern, indem du nicht auf Addressen >= 0xC0000000 zugreifst, denn ab da faengt ( meistens ) der Spielplatz des Kernels an und der mag es nicht wenn du dich dahin verirrst.
    Ja, und wenn die Zeiger sonst wohin zeigen soll er den Zeiger verwenden oder was? Worin soll da denn der Sinn liegen!?

  8. #8
    Registrierter Benutzer Avatar von r00t043
    Registriert seit
    11.01.2004
    Beiträge
    38
    Das habe ich nicht gesagt. Aber wenn man einen sofortigen Segfault bei einem "unbrauchbaren" Zeiger verhindern moechte, dann moechte man bestimmt nicht auf Speicher oberhalb dieser Addresse zugreifen.
    Ansonsten bin ich eher locus vivendi's Meinung.

  9. #9
    Registrierter Benutzer
    Registriert seit
    27.04.2001
    Beiträge
    62
    Zitat Zitat von r00t043
    Das habe ich nicht gesagt. Aber wenn man einen sofortigen Segfault bei einem "unbrauchbaren" Zeiger verhindern moechte, dann moechte man bestimmt nicht auf Speicher oberhalb dieser Addresse zugreifen.
    Ansonsten bin ich eher locus vivendi's Meinung.
    Ja aber stell dir vor du hast einen Zeiger der auf einen gueltigen Speicher zeigt aber nicht das ist was du willst. Ein Beispiel waere z.B. die Ruecksprungadresse auf dem Stack.

    Desshalb ergibt das auch keinen Sinn. Man sollte wirklich nur drei Arten von Zeigern sehen: gueltige, ungueltige und Zeiger auf NULL. Und letzteres sollte man verwenden. Referenzen gibt es in C nicht.

    Zu wissen wann ein Segmentation Fault kommt ist toll, aber hat IMHO keinen praktischen nutzen. Oder verwendest du solche Checks in deinen Programmen?

  10. #10
    Registrierter Benutzer Avatar von r00t043
    Registriert seit
    11.01.2004
    Beiträge
    38
    Zitat Zitat von chrizel
    Ja aber stell dir vor du hast einen Zeiger der auf einen gueltigen Speicher zeigt aber nicht das ist was du willst. Ein Beispiel waere z.B. die Ruecksprungadresse auf dem Stack.
    Trifft zwar generell nicht zu, aber das mache ich jetzt mal...
    Zitat Zitat von chrizel
    Desshalb ergibt das auch keinen Sinn. Man sollte wirklich nur drei Arten von Zeigern sehen: gueltige, ungueltige und Zeiger auf NULL. Und letzteres sollte man verwenden.
    Ich verwende meisstens erstere.SCNR.
    Ok hasst recht, aber das Gegenteil zu behaupten war auch nicht mein Ziel ( naeheres s.u. )
    Zitat Zitat von chrizel
    Referenzen gibt es in C nicht.
    Ich weiss...
    Zitat Zitat von chrizel
    Zu wissen wann ein Segmentation Fault kommt ist toll, aber hat IMHO keinen praktischen nutzen.
    Das ist was anderes ( Ein praktischer Nutzen koennte sein schnell noch was zu speichern ). Ich habe nur versucht folgendes Problem und Thema dieses Threads, das da waere:
    Zitat Zitat von peschmae
    Ich möchte nicht dass mein Programm gleich segfaulted nur weil irgendwer einer Methode einen Pointer übergibt der nicht "brauchbar" ist.
    ..., zu loesen
    Zitat Zitat von chrizel
    Oder verwendest du solche Checks in deinen Programmen?
    Brauche ich nicht, denn es ist die Aufgabe des Anderen mir vernueftige Werte zu geben.

  11. #11
    Registrierter Benutzer
    Registriert seit
    27.04.2001
    Beiträge
    62
    schlaumeier

  12. #12
    Registrierter Benutzer Avatar von r00t043
    Registriert seit
    11.01.2004
    Beiträge
    38
    Solange ich Recht behalte
    ( da das ja jetzt geklaert ist koennen wir uns ja mal den wichtigen Dingen im Leben widmen, wie zum Beispiel *kotzwuerg* DELPHI lernen )

  13. #13
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Na dann viel Spass mit Delphi

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  14. #14
    Registrierter Benutzer
    Registriert seit
    29.02.2004
    Beiträge
    113
    1. Unter UNIX kannst du SIGSEGF abfangen, indem du einen Signalhandler dafür registrierst. Allerdings sind "können" und "wollen" manchmal verschiedene Dinge...

    2. Was ist der Unterschied zwischen Referenzen und Pointern? (Sorry, aber kenne mich zwar mit OO allgemein, nicht aber mit C++ aus)

    Gruß,
    /dev

  15. #15
    Registrierter Benutzer
    Registriert seit
    27.04.2001
    Beiträge
    62
    Zitat Zitat von Deever
    2. Was ist der Unterschied zwischen Referenzen und Pointern? (Sorry, aber kenne mich zwar mit OO allgemein, nicht aber mit C++ aus)
    Eine Referenz ist ein alternativer Name fuer ein Objekt und normale Datentypen. Syntaktisch kann man Referenzen so verwenden wie wenn man das Objekt direkt verwenden wuerde. Das macht dann evtl. das Programm lesbarer weil man nichts dereferenzieren muss. Statt -> kann dann z.B. der Punkt verwendet werden. Referenzen muessen in C++ initialisiert werden und koennen danach nicht mehr geaendert werden. Desshalb sind damit auch keine arithmetische Operationen o.ae. moeglich.

    Viele verwenden Referenzen. Viele verzichten ganz darauf. Teilweise steckt dahinter eine Glaubens- und Geschmacksfrage. In einigen Dingen sind Referenzen recht gut. z.B. beim << Operator von cout, welcher eine Referenz auf cout zurueckgibt. Desshalb kann man mehrere << hintereinander machen.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •