PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : gcc vs. visual c++ 6.0



DarkTron
04-06-2003, 17:45
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?

anda_skoa
04-06-2003, 17:57
Ich denke, du musst mit -fexception kompilieren.

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

Ciao,
_

manny
14-06-2003, 20:33
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.

DarkTron
14-06-2003, 21:06
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.

sixfriends
15-06-2003, 17:58
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 :p

Dabei lässt es sich doch unter Windows so gut arbeiten :D
*SichRumdrehUndSchnellWeglauf*

tuxipuxi
15-06-2003, 18:45
ich erlebe gerade im irc wie schwachsinnig vc++ ist. das ding kannst du echt in die tonne knallen und windows gleich mit. :)

DarkTron
15-06-2003, 19:50
ich gebe hier auch zu dass ich c# unter windows programmiere! :eek: 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!

almoeli
16-06-2003, 15:11
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

peschmae
16-06-2003, 19:14
dann tretet doch all das C++/C - Pointer Zeugs in die Tonne :D

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

MfG Peschmä

anda_skoa
17-06-2003, 16:33
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,
_

almoeli
17-06-2003, 19:12
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