Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi BoolToStr wirft Memcheck Exception. (https://www.delphipraxis.net/108779-booltostr-wirft-memcheck-exception.html)

pertzschc 19. Feb 2008 14:04


BoolToStr wirft Memcheck Exception.
 
Hallo zusammen,

ich habe ein Projekt, welches ich gerade mit Memcheck auf Leaks überprüfe. Dabei meckert Memcheck folgende Codezeile an:

Delphi-Quellcode:
unit uProject.pas
// schreibe daten des projektes
...
319: ini.WriteString(cIniSectionProject, project_usernumberwithzero, BoolToStr(aTestProject.NumberWithZero, true));
...
Auszug aus dem Memcheck.log:

Size: 14
2 Occurences
call stack - 0 : (no debug info) Find error: 0000000E
call stack - 1 : Module sysutils.pas Routine @Sysutils@BoolToStr Line 4720 Find error: 0040A576
call stack - 2 : Module uProject.pas Routine @Uproject@SaveProjectDataToFile Line 319 Find error: 0054C3F0

Was läuft hier in @Sysutils@BoolToStr für Memcheck falsch ab?

Gruß,
Christoph

mkinzler 19. Feb 2008 14:10

Re: BoolToStr wirft Memcheck Exception.
 
Was steht in aTestProject.NumberWithZero?

pertzschc 19. Feb 2008 14:16

Re: BoolToStr wirft Memcheck Exception.
 
Zitat:

Zitat von mkinzler
Was steht in aTestProject.NumberWithZero?

Das ist eine public Property vom Typ boolean:

Delphi-Quellcode:
fNumberWithZero: boolean; // sollen nach dem prefix der nummernbereich mit nullen aufgefüllt werden?
...
property NumberWithZero: boolean read fNumberWithZero write fNumberWithZero;
...
constructor TTestProject.Create;
begin
  // rufe vater auf
  inherited Create;
  // eigene daten inits
  fNumberWithZero:=true;
end;

mkinzler 19. Feb 2008 14:17

Re: BoolToStr wirft Memcheck Exception.
 
Zitat:

Das ist eine public Property
Das dürfte das Problem sein.

pertzschc 19. Feb 2008 14:25

Re: BoolToStr wirft Memcheck Exception.
 
Zitat:

Zitat von mkinzler
Zitat:

Das ist eine public Property
Das dürfte das Problem sein.

Kannst Du es mir bitte näher erklären? Die Property ist vom typ boolean, was passiert da in BoolToStr() anderes als sonst?
Vielen Dank,
Christoph

pertzschc 6. Aug 2008 17:05

Re: BoolToStr wirft Memcheck Exception.
 
Hat keiner mehr eine Idee, was an der Property nun so falsch ist? (*Push*)

Gruß,
Chritoph

Neutral General 6. Aug 2008 17:12

Re: BoolToStr wirft Memcheck Exception.
 
Hi,

Also an den Properties kann es eigentlich nicht liegen, denn das hier funktioniert:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FVS: Boolean;
    { Private declarations }
  public
    property Test: Boolean read FVS write FVS;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Test := false;
  Caption := BoolToStr(Test,true);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Test := true;
end;
Schau lieber mal dort nach:

Zitat:

call stack - 2 : Module uProject.pas Routine @Uproject@SaveProjectDataToFile Line 319 Find error: 0054C3F0
Ich würde glatt behaupten, dass du dich da irgendwie verwurschtelt hast (vlt. auch mit Pointern) und es dann erst anschließend kracht (anschließend ist zufälligerweise BoolToStr).

Gruß
Neutral General

pertzschc 6. Aug 2008 17:17

Re: BoolToStr wirft Memcheck Exception.
 
Zitat:

Zitat von Neutral General
Schau lieber mal dort nach:

Zitat:

call stack - 2 : Module uProject.pas Routine @Uproject@SaveProjectDataToFile Line 319 Find error: 0054C3F0
Ich würde glatt behaupten, dass du dich da irgendwie verwurschtelt hast (vlt. auch mit Pointern) und es dann erst anschließend kracht (anschließend ist zufälligerweise BoolToStr).

Schau mal in meinen 1. Beitrag, da ist die Zeile 319 enthalten. Es kracht auch nicht in der Programmausführung, sondern Memcheck meldet ein Speicherleck im Zusammenhang mit BoolToStr() - Aufruf.

Hast Du noch eine Idee?

Gruß,
Christoph

RWarnecke 6. Aug 2008 17:18

Re: BoolToStr wirft Memcheck Exception.
 
Mal eine Frage, warum der Umweg über die Public-Property ? Ich würde statt
Delphi-Quellcode:
BoolToStr(aTestProject.NumberWithZero, true)
dieses hier schreiben
Delphi-Quellcode:
BoolToStr(fNumberWithZero, true)

pertzschc 6. Aug 2008 17:23

Re: BoolToStr wirft Memcheck Exception.
 
Zitat:

Zitat von RWarnecke
Mal eine Frage, warum der Umweg über die Public-Property ? Ich würde statt
Delphi-Quellcode:
BoolToStr(aTestProject.NumberWithZero, true)
dieses hier schreiben
Delphi-Quellcode:
BoolToStr(fNumberWithZero, true)

Ganz einfach, der Pointer auf das Projekt wird in die statische function() mit reingegeben.
Delphi-Quellcode:
function SaveProjectDataToFile(aTestProject: TTestProject): boolean;
Daher der Zugriff auf alle public properties des Objektes für das Speichern. Hältst Du das für falsch?
Gruß,
Christoph


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 Uhr.
Seite 1 von 2  1 2      

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