Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PChar als Result wird verfälscht (https://www.delphipraxis.net/47800-pchar-als-result-wird-verfaelscht.html)

Stevie 16. Jun 2005 13:19


PChar als Result wird verfälscht
 
Hallo Leute,

ich bin gerade dabei, einen Bug in Zeos zu beheben, aber ich komm nicht drauf.
Ich habe folgende Funktion:
Delphi-Quellcode:
function TZRowAccessor.GetPChar(ColumnIndex: Integer;
  var IsNull: Boolean): PChar;
begin
{$IFNDEF DISABLE_CHECKING}
  CheckColumnConvertion(ColumnIndex, stString);
{$ENDIF}
  Result := nil;
  if FBuffer.Columns[FColumnOffsets[ColumnIndex - 1]] = 0 then
  begin
    case FColumnTypes[ColumnIndex - 1] of
      stString:
        Result := @FBuffer.Columns[FColumnOffsets[ColumnIndex - 1] + 1];
      else
        Result := PChar(GetString(ColumnIndex, IsNull)); // <-- diese Zeile wird ausgeführt
    end;
    IsNull := False; // <-- Haltepunkt
  end else
    IsNull := True;
end;
Beim Haltepunkt steht das richtige Ergebnis in Result,
allerdings werden beim nächsten Befehl einige Zeichen abgeschnitten/verfälscht.

Im CPU-Fenster kann ich beobachten, dass der Aufruf der Methode LStrClr diese Veränderung hervorruft.
Das komische ist, dass dies unregelmäßig geschieht. Hat jemand eine Ahnung, woran das liegen könnte?

MfG
Stevie

Robert Marquardt 16. Jun 2005 13:23

Re: PChar als Result wird verfälscht
 
Ein String in Delphi hat einen Referenzzaehler. Temporaere Strings wie der von GetString werden gleich wieder geloescht, da PChar() natuerlich nicht den Referenzzaehler erhoeht.
Der Zeiger zeigt also auf einen freigegebenen Speicherbereich, der natuerlich schnell wiederverwertet wird.

Der Fehler ist prinzipiell. ZRowAccessor.GetPChar ist unsinnig.

Stevie 16. Jun 2005 13:40

Re: PChar als Result wird verfälscht
 
Zitat:

Zitat von Robert Marquardt
Ein String in Delphi hat einen Referenzzaehler. Temporaere Strings wie der von GetString werden gleich wieder geloescht, da PChar() natuerlich nicht den Referenzzaehler erhoeht.
Der Zeiger zeigt also auf einen freigegebenen Speicherbereich, der natuerlich schnell wiederverwertet wird.

Der Fehler ist prinzipiell. ZRowAccessor.GetPChar ist unsinnig.

Hrmpf :? Die Funktion ist so in Zeos fest eingebunden.

Gibt es eine Möglichkeit, dass dieser temporäre string nicht wieder freigegeben wird?

Muetze1 16. Jun 2005 13:48

Re: PChar als Result wird verfälscht
 
Moin!

Nutze die alten Funktionen wie StrAlloc() um die Speicher zu alloziieren und StrPCopy() um diesen zu befüllen.

MfG
Muetze1

Stevie 16. Jun 2005 13:55

Re: PChar als Result wird verfälscht
 
Ich hab mir jetzt mal anders beholfen und eine string-variable im privaten Bereich des Objekts angelegt,
wo ich das Ergebnis von GetString speichere. Dieses wird dann an die Funktion PChar übergeben.
Bis jetzt kann ich den Fehler nicht mehr feststellen. Könnte das die Lösung sein?

Zacherl 16. Jun 2005 14:32

Re: PChar als Result wird verfälscht
 
Hallo,
Also wenn der Fehler nicht mehr kommt, dürfte das Problem wohl erledigt sein, oder? :wink: :stupid:

Florian

Robert Marquardt 16. Jun 2005 14:33

Re: PChar als Result wird verfälscht
 
Ja, das ist die Loesung. Jetzt ist der String gueltig solange es das Objekt gibt.
String ist bei Delphi die einzig wirklich vollstaendig objektorientiert Datentyp.
Bei einer lokalen Variablen wird z. B. heimlich ein try finally eingerichtet und die Variable erst auf nil = Leerstring initialisiert und im finally wieder freigegeben. Entsprechjhndes gilt natuerlich fuer Elemente einer Klasse.
Das ist auch der Grund warum eine Funktion mit string-Result nie ueber ein uninitialisiertes Ergebnis klagt. Result faellt namelich unter die lokalen Variablen und wird initialisiert (aber natuerlich nicht freigegeben).


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz