Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Probleme mit Zeigern

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 <
010
29.05.2010, 16:27 Uhr
TOSHMAX



Der Fehler kommt aus diesen 2 Zeilen:

C++:
SceneObjectList a;
a = SceneObjectList::SceneObjectList();


In Zeile 2 wird hier der standard Kopierkonstruktor aufgerufen. Der kopiert die Speicheraddresse, auf die data zeigt.
Anschließend wird noch der Destruktor vom ersten Objekt aufgerufen, der diesen Speicher freigibt und das führt dann zu den Problemen bei der Benutzung des neuen Objekts.

Dieser Post wurde am 29.05.2010 um 16:28 Uhr von TOSHMAX editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
29.05.2010, 16:35 Uhr
0xdeadbeef
Gott
(Operator)


Also ist das tatsächlich ein temporäres Objekt mit merkwürdigem Lookup? Okay, dann ergibt das Sinn.

Was das Innenleben der Klasse angeht, wenn die Klasse automatisierte Tests erfüllen soll, zählt, dass das Interface sich nicht verändert. Wie das bedient wird, ist ihnen herzlich egal.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
29.05.2010, 17:28 Uhr
~jojo
Gast


Hallo nochmal,

ich glaube dass ich den Fehler gefunden habe, es kracht nämlich nicht mehr .Wo genau der Fehler lag kann ich jetzt allerdings nicht mehr sagen. Es wahr wohl eine Mischung aus Problemen im Destruktor sowie im erstellen des Objekts von SceneObject (wie oben jmd. geschrieben hat).

So läufts jetzt (auf jeden Fall mal das Anhängen und Vergrößern der Liste:


C++:
void SceneObjectList::add(SceneObject* object)
{
    if (numberElements == arraySize)
        {
        SceneObject** data2;
        data2 = new SceneObject*[arraySize*2];
        for (int i = 0; i < (numberElements); i++)
            data2[i] = data[i];
        delete[] data;
        data = data2;
        //delete data2;
        arraySize = arraySize*2;
        }
    data[numberElements] = object;
    numberElements++;
}

SceneObjectList::~SceneObjectList()
{    
    //for (int i = 0; i < (numberElements);i++)
    //        delete data[i];
    delete[] data;
    data = NULL;
}



und das "Hauptprogramm":


C++:
SceneObjectList a;
//a = SceneObjectList::SceneObjectList();
for (int i = 0; i < 2; i++)
    a.add(SceneObjectFactory::createBlueSphere(Point(0,10,0),5));
cout << "einfacher Add test bestanden" << endl;
for (int i = 0; i < 5; i++)
    a.add(SceneObjectFactory::createBlueSphere(Point(0,10,0),5));
cout << "schwerer add test bestanden" << endl;
Color b = Color(0,0,1.0);
Color c;
c = a.getObject(2)->getColor();
cout << "Bloeder Fehler";
return 1;



Auf jeden Fall vielen Dank für die Hilfe.

Mfg (ich melde mich bestimmt demnächst wieder )

Jojo

PS: Klar, dass wenn ich das Interface nicht verändere, der Test das nicht merkt. Wir müssen jedoch auch eine Dokumentation mit Doxygen erstellen und ich weiß nicht wie genau die das prüfen...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
29.05.2010, 17:55 Uhr
ao

(Operator)



Zitat von ~jojo:
Es wahr wohl eine Mischung aus Problemen ...


C++:
SceneObjectList::~SceneObjectList()
{    
    //for (int i = 0; i < (numberElements);i++)
    //        delete data[i];
    delete[] data;
    data = NULL;
}





Schön, dass es läuft, aber ich fürchte, dass du jetzt ein Speicherleck hast. Falls die Regel gilt, dass die Factory-Methoden die SceneObjects per new erzeugen, dann müssen sie auch deletet werden.
 
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: