Anzeige:
Ergebnis 1 bis 11 von 11

Thema: gcc vs. visual c++ 6.0

  1. #1
    Registrierter Benutzer
    Registriert seit
    04.06.2003
    Beiträge
    6

    gcc vs. visual c++ 6.0

    hallo,
    habe jetzt mal etwas angefangen c++ unter linux zu programmieren,bin aber auch noch total anfänger. dabei ist mir folgendes aufgefallen. wenn ich z.b. drei pointer (p1,p2,p3) habe, die alle auf den gleichen speicherbereich zeigen. und nun in vsc++ folgendes mache:

    delete p1;
    delete p2;
    delete p3;

    dann bekomme ich bei "delete p2" eine exception, wenn ich aber unter linux mit gcc dieses auch mache, dann führt er (standardmäßig) alle drei befehle ohne fehlermeldung aus.
    was kann ich machen,damit auch unter linux (besonderst bei kdevelop dabei eine exception kommt?

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ich denke, du musst mit -fexception kompilieren.

    Versuch mal, das bei Projekt->Optionen->Compilerschaltet einzutragen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    31.01.2001
    Ort
    Bingen
    Beiträge
    42
    Ein Zeiger ist eine Variable, die die Adresse einer anderen Variablen enthält.

    Du kannst nicht 2mal den selben Speicherbereich freigeben !!!!

    mit "delete p1;"
    hast du den Speicherbereich freigegeben.

    "delete p2;"
    "delete p3;"

    macht dasselbe. Aber da der Speicher bereits an dieser Stelle frei ist, bekommst du eine exception.
    Ich bremse auch für Trolle.

  4. #4
    Registrierter Benutzer
    Registriert seit
    04.06.2003
    Beiträge
    6
    jup, das stimmt.
    aber mir ging es ja darum mas ich beim debuggen/ausführen des mit gcc erstellten programmcodes KEINE exception bekommen habe! er hat ohne zu meckern dreimal den specherbereich freigegeben.

  5. #5
    Registrierter Benutzer Avatar von sixfriends
    Registriert seit
    26.03.2003
    Ort
    /home/sixfriends
    Beiträge
    285
    Du gibst hier also öffentlich zu, dass du c++ unter Windows programmiert hast. Als ich das das letzte mal gemacht habe bin ich fast schon wüst beschimpft worden, also duck dich um den Steinen der Linuxfanatiker auszuweichen

    Dabei lässt es sich doch unter Windows so gut arbeiten
    *SichRumdrehUndSchnellWeglauf*
    .
    Wenn die Sonne der Kultur niedrig steht, werfen selbst Zwerge einen Schatten.

  6. #6
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    ich erlebe gerade im irc wie schwachsinnig vc++ ist. das ding kannst du echt in die tonne knallen und windows gleich mit.

  7. #7
    Registrierter Benutzer
    Registriert seit
    04.06.2003
    Beiträge
    6
    ich gebe hier auch zu dass ich c# unter windows programmiere! aber irgentwie muß man ja sein geld verdienen.

    alle linux-fanatiker die jetzt nach ihren steinen greifen sollen mir aber bitter vor oder nach dem werfen mal erklären warum vc++ diesen fehler richtig behandelt und was ich machen muß dass gcc es auch macht!

  8. #8
    Registrierter Benutzer
    Registriert seit
    16.06.2003
    Beiträge
    73
    Hi,

    leider wirst du es nicht schaffen, mit dem gcc und der damit verwendeten libstdc++ eine Exception beim delete zu erzeugen, weil dies dort einfach nicht implementiert ist. Man muß also selbst drauf achten, daß man einen Speicherbereich nur einmal freigibt.
    Im Debugger fängt man solche Aktionen aber auch, da sie normalerweise einen 'Segmentation Fault' erzeugen und der Debugger dir dann die Stelle anzeigt.
    Unter VC++ funktioniert das mi der Exception auch nur wenn man sein Projekt im Debugmodus übersetzt, weil der VC++ dann eine Bibliothek anzieht, die über alle Heap Belegungen ein Protokoll führt und deshalb solche illegalen Freigaben abfängt. Sobald du dein Projekt als Release übersetzt ist dieser Check auch draussen und ein mehrfaches delete führt zum u.U. zum Absturz des Programms.

    Gruß

    almoeli

  9. #9
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    dann tretet doch all das C++/C - Pointer Zeugs in die Tonne

    dadurch werden zwar kde/gnome noch lahmer, aber man ist n paar hübsche Problemchen los

    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)

  10. #10
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von DarkTron

    alle linux-fanatiker die jetzt nach ihren steinen greifen sollen mir aber bitter vor oder nach dem werfen mal erklären warum vc++ diesen fehler richtig behandelt und was ich machen muß dass gcc es auch macht!
    Das Problem ist, das das Standard autoconf/automake template vopn KDevelop die Compilerflags auf -fnoexception setzt.

    Muss mir dazu erst ansehen, wie man das wieder ausschalten kann.

    @almoeli: bist du dir sicher, dass in libstd-c++ keine Exception in delete geworfen wird?
    GCC2.95 und GCC3?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  11. #11
    Registrierter Benutzer
    Registriert seit
    16.06.2003
    Beiträge
    73
    Hi,

    ja, ich bin mir sicher! weil der delete operator in der stdc++ lib folgendermaßen implemetiert ist (siehe Sourcen von gcc-base.3.x/libstdc++/ irgendwo ist da ein file delop.cc oder so ähnlich):

    ...
    {
    if(ptr)
    free(ptr);
    }

    und das wars! nix mit einer Exception sondern eine einfache malloc und free Implemetierung. Immerhin wirft der new operator eine exception, wenn er keinen Speicher mehr belegen kann. Aber auch nur wenn man ein bestimmtes #define Macro setzt. Wie das heißt, muß man wieder in den Sourcen nachschauen (file newop.cc).

    Gruß

    almoeli

Lesezeichen

Berechtigungen

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