Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » ganz ganz komischer speicherfehler Hilfe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
18.06.2003, 17:24 Uhr
~karlnapf
Gast


hallo zusammen
ich schreibe an eine grafikbiblio ...aber das ist eigentlcih auch egal
mein problem:
ich habe die 4 folgenden anweisungen:

C++:
const int pacman1 = blub->mAddSurface ("bild1.txt", false);
const int pacman2 = blub->mAddSurface ("bild1.txt", false);
const int background = blub->mAddSurface ("background.png", true);
blub->mGetSurface (background).mBlit()


das soll ein bild auf den schrim zeichnen ..ist ja aber auch egal ....
es gibt einen segfault ..speicherfehler bei anweisung 4

wenn ich nach den 3 zeilen die mit "const int" anfangen reinschreibe dass jeweils die adresse von dem surface (ein objekt) auf cout ausgeben soll, also so:

C++:
const int pacman1 = blub->mAddSurface ("bild1.txt", false);
cout << &blub->mGetSurface (pacman1) << endl;
const int pacman2 = blub->mAddSurface ("bild1.txt", false);
cout << &blub->mGetSurface (pacman2) << endl;
const int background = blub->mAddSurface ("background.png", true);
cout << &blub->mGetSurface (background) << endl;



dann gibts KEINEN speicherfehler bei der vierten anweisung ...
was soll das?
wieso ist der fehler weg nur wenn ich die adresse des objekts ausgebe?

ich weiß ist ein komischer fehler ..habe ehrlcih gesagt den verdacht dass meine libc kaputt ist ....aber danke für die hilfe

karlnapf

Dieser Post wurde am 18.06.2003 um 17:36 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.06.2003, 17:49 Uhr
~0xdeadbeef
Gast


Huh? Welcher Compiler übersetzt das? Einem const int sollte man eigentlich nicht den Rückgabewert einer Funktion zuweisen können, weil der erst zur Laufzeit feststeht...ansonsten würde ich vermuten, dass der Fehler in der Methode mBlit() liegt, die du beim ersten mal aufrufst, aber nicht beim zweiten mal.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.06.2003, 17:55 Uhr
ao

(Operator)



Zitat:
~karlnapf postete
wieso ist der fehler weg nur wenn ich die adresse des objekts ausgebe?

Weil es ein Ding ist, eine Adresse per cout auszugeben, und ein völlig anderes, sie als Sprungadresse für ausführbaren Code zu verwenden, dabei wird sie nämlich dereferenziert und das geht nur auf Speicher, der dem Programm gehört (sonst SegFault).

Offensichtlich ist das von blub->mGetSurface() zurückgegebene Objekt nicht so beschaffen, wie du es erwartest. Du solltest diesen Fehler im Debugger untersuchen.

Oder wenigstens die Zeile in zwei Schritten ausführen, um die Sache etwas einzukreisen:
bla = blub->GetSurface();
bla.mBlit();

Zitat:
..habe ehrlcih gesagt den verdacht dass meine libc kaputt ist

Das ist sehr unwahrscheinlich.

Viel Erfolg.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.06.2003, 17:57 Uhr
ao

(Operator)



Zitat:
~0xdeadbeef postete
Huh? Welcher Compiler übersetzt das? Einem const int sollte man eigentlich nicht den Rückgabewert einer Funktion zuweisen können

Falscher Alarm. Das ist eine Initialisierung, keine Zuweisung, und die funktioniert auch bei const-Objekten.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.06.2003, 17:58 Uhr
~karlnapf
Gast


ja ..alles ok ..aber mein problem ist dass das programm auf einmal geht wenn ich den pointer auf dem bildschrim ausgebe ....dann ist kein segfault mehr
und wenn ich den pointer nicht ausgebe gehts nicht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.06.2003, 18:07 Uhr
~0xdeadbeef
Gast


Auch bei der Initialisierung einer Konstante muss der Wert zur Compilezeit feststehen, Funktionsaufrufe bleiben ganz außen vor. Zum Beispiel dieser Code:

C++:
#include <stdlib.h>
#include <sys/time.h>

int number(){
    return 2;
}

const int i = number();

main(){
    printf("%d\n",i);
}


Erzeugt beim Kompilieren die Fehlermeldung

Code:
$ gcc test.c
test.c:8: error: initializer element is not constant

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.06.2003, 18:20 Uhr
~karlnapf
Gast


ich benutze g++
aber wenn ich das änder ändert das auch nix
segfault wenn ich den pointer auf das objekt nicht ausgeben
alles prima wenn ichs ausgebe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.06.2003, 18:27 Uhr
ao

(Operator)


Weil irgendeine Kleinigkeit anders ist. Du hast vermutlich irgendwo, möglicherweise an einer ganz anderen Stelle, einen wildgewordenen Pointer, z.B. durch vergessene Initialisierung, falsche Konstruktion, Indexüberschreitung etc. Das kann die merkwürdigsten Effekte haben, und durch Einbauen von cout-Ausgaben kann man das Fehlerbild wahllos verändern (ich spreche aus Erfahrung).

Es hat keinen Sinn, an so einem Fehler mit cout herumzudoktern, wenn das Programm so labil ist, daß es dadurch schon sein Verhalten ändert. Nimm einen Debugger zur Hilfe.

Schalte beim Kompilieren den höchstmöglichen Warninglevel ein, vielleicht bekommst du Hinweise auf Variablen, die ohne Initialisierung verwendet werden.

Initialisiere alle Variablen, die Globalen und die Membervariablen zuerst, danach die lokalen Hilfsvariablen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.06.2003, 18:32 Uhr
ao

(Operator)



Zitat:
~0xdeadbeef postete
Auch bei der Initialisierung einer Konstante muss der Wert zur Compilezeit feststehen, Funktionsaufrufe bleiben ganz außen vor. Zum Beispiel dieser Code:

C++:
#include <stdlib.h>
#include <sys/time.h>

int number(){
    return 2;
}

const int i = number();

main(){
    printf("%d\n",i);
}


Erzeugt beim Kompilieren die Fehlermeldung

Code:
$ gcc test.c
test.c:8: error: initializer element is not constant



Du wirfst Sachen durcheinander. Das i ist ein globales Objekt, dessen Wert tatsächlich zur Compilezeit berechnet wird. Laß das const davor weg, und es geht immer noch nicht.

Ein lokales Objekt const int i läßt sich mit einem Funktionsergebnis initialisieren.

int main (void)
{
const int i = number ();
return 0;
}
ist korrekt.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
18.06.2003, 21:01 Uhr
virtual
Sexiest Bit alive
(Operator)


Bei beefy tut das deshalb nicht, weil er das als C Code übersetzt hat, in C++ ist das, wie ao schon bemerkt hat, eine initialisierung und keine Zuweisung ist. Allerding sollte nicht unerwähnt bleiben, daß es vollkommen wurscht ist, ob es global oder lokal ist.

Der einzige Unterschied zwischen const-Objekten, deren Wert zur Compilezeit noch nicht feststeht und denen, deren Wert feststseht ist der, daß erstere niemals vom Compiler wegoptimiert werden können. Konkret:

C++:
const int i = 5;


Hier darf der Compiler den Speicherplatz von i wegoptimieren (er muß nicht, manchmal kann er es auch nicht, zB wenn &i verwendet wird).
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: