Announcement

Collapse
No announcement yet.

Probleme mit getmem bei Portierung von Delphi 2 auf Delphi 5

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit getmem bei Portierung von Delphi 2 auf Delphi 5

    Hallo,

    mittlerweile habe ich mir Delphi 5 Pro. zugelegt. Bei der Portierung einer mit Delphi 2 C/S erstellten Anwendung treten massive Probleme mit der procedure getmem() auf.

    Ich habe ein Record definiert (u. a. mit Stringwerten). Mit dieser Datenstruktur wird dann ein Array definiert.

    Dieses Array wird dynamisch erzeugt. Der benötigte Speicher wird mit getmem() angefordert. Beim ersten Schreibzugriff auf dieses Array wird eine Zugriffsverletzung gemeldet (EAccessViolation). Der Index des Array's liegt im gültigen Bereich.

    Verwende ich statt getmem die function allocmem() funktioniert es wie gewohnt.

    Hat die procedure getmem eine "Macke" (bug)?

    Sehr verwundert hat mich beim debuggen des Programms die unterschiedliche Datenstruktur der dynamischen Variable. Mit allocmem() werden die Daten Record für Record gespeichert (so erwarte ich das auch), bei der Verwendung von getmem() werden jedoch die Daten wie folgt gespeichert:

    <pre>
    a = record
    b: integer;
    c: string;
    end;

    a1: array[1..3] of a;

    Die Daten werden im Speicher in der Form abgelegt a1(b , b , b, c, c, c)

    Zumindest stellt der Debugger es so dar.

    </pre>

    Als Betriebssystem läuft NT 4.0 SP 5.

    Tschüß

    Torsten

  • #2
    Kleine Korrektur zur Datenspeicherung mit getmem(),

    die Daten werden auch Record für Record abgelegt. Allerdings werden bei der Darstellung des Recordinhaltes nur einige Recordfelder angezeigt.

    Die Probleme treten nur auf wenn im Record "lange" Strings verwendet werden

    Comment


    • #3
      Ich habe ein ähnliches Problem mit einem D2-Projekt aber das Problem tritt erst beim Reallokieren des Speichers auf (wenn das Array vergrössert wird)

      Comment


      • #4
        Also:

        Eigentlich müsste GetMem schon funktionieren, aber

        da in der Delphi-Hilfe (dynamische Arrays) steht, man
        soll nur SetLength und Copy zum dimensionieren von
        dynamischen Arrays benutzen, ...

        Bei mir jedenfalls funktionierts. ;-)

        Ansonsten mal das nicht dokumentierte TSparsePointerArray angucken
        (-> Grids.pas

        Comment


        • #5
          Hi,

          bei Getmem() wird zwar der notwendige Speicher zur Verfügung gestellt, allerdings hat dieser Speicherbereich keinen definierten Inhalt. Im Unterschied zu Delphi 2 erfolgt vor einem Schreibzugriff auf einen langen String immer erst ein Lesezugriff. Da nun der Zeiger auf den langen String keinen definierten Zustand hat (ungültige Adresse) kommt natürlich eine Zugriffsverletzung.

          Tschüß

          Torste

          Comment


          • #6
            Hi

            Hm, Torsten hat nicht ganz recht.

            Mit GetMem allozierst Du einen uninitialisierten Datenbereich. Dabei ist NICHT wichtig das die einzelnen Datenelemente uninitialisiert sind, sondern die Tatsache das ein dynamisches Array ein Speicherbereich ist in dem ein kleiner Header mitverwaltet wird. Dieser "Header" enthält den Benutzungszähler (Referencecounter), Längenangabe und wird mit SetLength() etc. verwaltet/angelegt und vollständig transparent verwaltet. D.h. Setlength() alloziert mit Getmem einen Speicherbereich + diesen Header. Header wird initialisiert und der zurückgelieferte Pointer um die Headergröße aufaddiert. Der Pointer auf Deinen LongString/DynArray zeigt also Pointer - 8 mit einem Displacement auf den verwendeten Speicher. Nun, Getmem tut dieses NICHT. Und so wird im nachhinein ein normaler DynArray Zugriff in den davorliegenden Speicherblock lesen/schreiben und so langfristig zu Zugriffsverletzungen führen.

            Gruß Hage

            Comment


            • #7
              Hallo Hagen,

              vielen Dank für Deine Info. Man kann halt immer wieder etwas dazulernen.

              Tschüß

              Torste

              Comment

              Working...
              X