Speicher Adresse einer TStringList



  • hallo akari 🕶

    SList->Add(...);
    (*SList).Add(...);

    das ist mir neu! stand bislang in keinem buch 😉 man lernt nie aus, besten dank dazu.



  • btw: heisst das also das variable/objkete die auf dem stack erzeugt werden, bezüglich pointer immer mit einem stern operator gekennzeichnet werden müssen und variable/objkete die auf dem heap erzeugt werden, also dynamisch, ohne den sternoperator gekennzeichnet werden müssen, da es klar ist das diese im speicher adressiert sind? ist das inetwa so zu verstehen?



  • Hallo

    Schumo schrieb:

    Ich gebe doch den speicher des List objektes, über die DLL nicht wieder frei, warum also diese exception die nach delete List auftritt?

    aus deinem Quellcode kann ich noch keinen Grund für die Zugriffsverletzung ausmachen. Sicher das du nicht doch verher schon ein delete ausführst?

    heisst das also das variable/objkete die auf dem stack erzeugt werden, bezüglich pointer immer mit einem stern operator gekennzeichnet werden müssen und variable/objkete die auf dem heap erzeugt werden, also dynamisch, ohne den sternoperator gekennzeichnet werden müssen, da es klar ist das diese im speicher adressiert sind? ist das inetwa so zu verstehen?

    Nein. Pointer bzw. Referenzierung sind von Heap/Stack erstmal unabhängig. Wobei natürlich auf den Heap mit Pointern zugegriffen wird.

    bis bald
    akari



  • Sicher das du nicht doch verher schon ein delete ausführst?

    ja schon. code mässig habe ich sogut wie alles gepostet. bei den "//..." steht nichts weiter. Kann es an der DLL an sich liegen, also wie man sie verwendet? ich linke die lib gleich mit und erspare mir den weg über LoadLibrary. An was könnte es sonst noch liegen? Lasse ich in der exe anwendung das delete List; weg und teste mit einem zweiten button die List, existiert sie weiterhin. Insofern verstehe ich nicht wo bitte der speicher freigegeben wird. 🙄



  • Vielleicht nicht beachtet, was da steht, wenn man eine DLL entwirft:

    //---------------------------------------------------------------------------
    //   Wichtiger Hinweis zur DLL-Speicherverwaltung, falls die DLL die statische
    //   Version der Laufzeitbibliothek (RTL) verwendet:
    //
    //   Wenn die DLL Funktionen exportiert, die String-Objekte (oder Strukturen/
    //   Klassen, die verschachtelte Strings enthalten) als Parameter oder Funktionsergebnisse übergibt,
    //   muß die Bibliothek MEMMGR.LIB im DLL-Projekt und anderen Projekten,
    //   die die DLL verwenden, vorhanden sein. Sie benötigen MEMMGR.LIB auch dann,
    //   wenn andere Projekte, die die DLL verwenden, new- oder delete-Operationen
    //   auf Klassen anwenden, die nicht von TObject abgeleitet sind und die aus der DLL exportiert
    //   werden. Durch das Hinzufügen von MEMMGR.LIB wird die DLL und deren aufrufende EXEs
    //   angewiesen, BORLNDMM.DLL als Speicherverwaltung zu benutzen. In diesem Fall
    //   sollte die Datei BORLNDMM.DLL zusammen mit der DLL weitergegeben werden.
    //
    //   Um die Verwendung von BORLNDMM.DLL, zu vermeiden, sollten String-Informationen als "char *" oder
    //   ShortString-Parameter weitergegeben werden.
    //
    //   Falls die DLL die dynamische Version der RTL verwendet, müssen Sie
    //   MEMMGR.LIB nicht explizit angeben.
    //---------------------------------------------------------------------------
    


  • hab ich tatsächlich nicht beachtet. danke nun klappt es. eine frage noch zum posting zuvor:

    Die Adresse von einem Pointer bekommst du so
    C/C++ Code:
    TStringList *SList...;
    int Adresse = SList;

    da bekomme ich aber wie erwartet die meldung:

    [C++ Fehler] Unit1.cpp(28): E2034 Konvertierung von 'TStringList *' nach 'int' nicht möglich



  • Hallo

    sorry, must noch casten

    int Adresse = (int)SList;  //oder
    int Adresse = reinterpret_cast<int>(SList);
    

    bis bald
    akari



  • danke. eine kleine offtopic frage noch.
    stimmt es das die typumwandlung "(typ)var" C stil ist, und "typ(var)" C++ stil?



  • Hallo

    nein

    var = (typ)var2; // Der C-Style Cast
    var = reinterpret_cast<typ>(var2); // Ein C++ Style Cast
    var = typ(var2); // Aufruf des Konstruktors von typ, mit var2 als Parameter
    

    bis bald
    akari



  • Aufruf des Konstruktors von typ

    versteh ich nun nicht ganz mit elementarischen typen wie int char etc. string ist ja eine klasse der stl soviel ich weis, richtig? aber die elementarischen typen sind doch die C++ schlüsselwörter, eben int, float, char, double, etc.

    wenn du von konstruktor sprichst kommt mir eben als erstes eine klasse in den sinn und dann müsste ja ein int eine klasse sein? 😮 😮 strange.. 🕶



  • Hallo

    Auch die PODs wie int haben einen Konstruktor. Probiers doch mal aus :

    int x = int(5);
    

    bis bald
    akari


Anmelden zum Antworten