oh gott - schon wieder zeiger ....



  • hi,
    ich habe das problem, dass mein programm immer an einer bestimmten stelle abstürzt.
    und zwar scheine ich folgendes problem zu haben:

    wenn ich etwas in der der art habe:

    typedef struct ObjProVal
    {
    char *charVal;
    }PROPVAL;

    und dann ein dynamisches array in einer klasse erzeuge :

    void ValueClass::InitValues(int size)
    {
    Values = new PROPVAL[size];
    }

    habe ich auch keine probleme, die erzeugten daten wieder mittels

    void ValueClass::DestroyValues()
    {
    for (int i = 0; i <= size-1;i++) {delete [] Values[i].charVal;}
    delete [] charVal;
    }

    zu löschen.

    wenn ich nun aber folgendes habe:

    typedef struct Vect
    {
    double x;
    double y;
    double z;
    }VECTOR;

    und ein ähnliches Array erzeuge:

    void ObjectClass::SetObjectSize(long Points)
    {
    Pts = new VECTOR[Points];
    }

    und anschliessend die löschung folgendermassen vornehme:

    void ObjectClass::DestroyPts()
    {
    delete [] Pts;
    }

    kommt irgendwann genau bei dem Aufruf ein fehler.
    es handelt sich hierbei übrigens um pseudocode, da die kompletten definitionen zu umfangreich sind.

    eines noch. die beiden Klassen sind folgendermassen integriert:

    class MainObject
    {
    ValueClass *ValueList;
    ObjectClass *PtsList;
    }

    MainObject ist Element in einer verketteten Liste.
    Das erzeugen und der Zugriff klappt einwandfrei.
    Die valuelist kann ich auch löschen, aber Pts macht mir sorgen...

    hat jemand eine Idee ?
    ich weiss, es ist etwas unübersichtlich geschrieben, aber vieleicht kann mir dennoch jemand helfen 😞



  • Einen offentsichtlichen Fehler kann ich nicht sehen.
    1.) Wenn der Fehler reproduzierbar ist, dann schmeiss mal deinen
    Debugger an. 😉
    2.) Verwende STL-Container zur "Aufbewahrung" deinen Elemente. Dadurch
    entschärfst du etwaige Probleme bei der dynamischen Speicherverwaltung.

    mfg JJ



  • naja das mit dem debugger ist so ne sache, die arrays werden innerhalb eines plugins(dll) erzeugt - gelöscht weren sie im hauptprogramm...
    ich kann dummerweise im debug modus keine plugins aufrufen (das debuggen ist also nur eingeschränkt möglich) 😞

    da die arrays ständig verändert werden lösche/erzeuge ich sie innerhalb der dll immer wieder neu. hier schein das löschen zu klappen. kopier ich aber den code in das hauptprogramm, um das objekt endgültig zu löschen (d.h. aus der verketteten liste), stürzt alles ab.

    der debugger sagt eindeutig, dass der fehler bei :

    delete [] Pts;

    liegt.... komscherweise kommt der fehler erst beim 12ten lösch befehl ?!

    ich kriege langsam eine kriese ich programmiere mittlerweile schon monate an dem ding. der source code ist in 37 dateien aufgeteilt. ich habe den code nun zwei wochen liegen lassen, weil ich nicht auf den fehler komme, nun schaffe ich es immer noch nicht... mit stl habe ich ehrlich gesagt keine erfahrungen... danke für die antwort...

    muss wohl weiter rätzeln 😞



  • Plugin-Hauptprogramm ?? Vielleicht Probleme bei der Interthread-Kommunikation ?
    Was für einen Fehler bekommst du eigentlich genau. (Nummer-Description)

    mfg JJ



  • also das fehlermelungsfenster teilt mir mit:

    "Die Anweisung in "0x77f49163" verweist auf Speicher in "0x0000002c". Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden.

    Mircosofts Entwicklungsumgebubg spricht von:

    "Unbehandelte Ausnahme bei "0x77f49163" in Amanda.exe. 0xC00000005:
    Zugriffsverletzung-LesePosition "0x0000002c".

    mehr bekomme ich nicht. ausse ein paar speicherstellen und den grünen pfeil an der genannten stelle.

    ich glaube aber nicht wirklich, dass es tatsächlich am plugin liegt, da er die anderen arrays, welche in der gleichen dll erzeugt werden anstandslos löscht (zumindest stürzt er nicht ab).



  • ich habs ... anscheinend liegt es wirklich am plugin....
    ich habe einfach eine dll funktion eingefügt, die innerhalb des Plugins alle in der dll angelegten Listen löscht....
    es scheint zu klappen. mal schaun, was weiteres testen zeigt, allerdings finde ich es nicht gerade optimal - ehrlich gesagt... aber naja - muss ich mit abfinden.

    kann mir jemand erklären, warum das so ist ?



  • Ist das VC++? Verwenden sowohl Plugin als auch Hauptprogramm die dynamische Runtime?



  • ich muss jetzt ehrlich gesags bei deiner frage passen,
    dynamische runtime ?



  • Bei meinem VC++ 6 ist das bei "Code Generation" und heißt "Use run-time library: Multithreaded DLL".



  • ach so sorry,

    es handelt sich um ein runtime plugin/dll.


Anmelden zum Antworten