![]() |
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:
Auszug aus dem Memcheck.log:
unit uProject.pas
// schreibe daten des projektes ... 319: ini.WriteString(cIniSectionProject, project_usernumberwithzero, BoolToStr(aTestProject.NumberWithZero, true)); ... 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 |
Re: BoolToStr wirft Memcheck Exception.
Was steht in aTestProject.NumberWithZero?
|
Re: BoolToStr wirft Memcheck Exception.
Zitat:
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; |
Re: BoolToStr wirft Memcheck Exception.
Zitat:
|
Re: BoolToStr wirft Memcheck Exception.
Zitat:
Vielen Dank, Christoph |
Re: BoolToStr wirft Memcheck Exception.
Hat keiner mehr eine Idee, was an der Property nun so falsch ist? (*Push*)
Gruß, Chritoph |
Re: BoolToStr wirft Memcheck Exception.
Hi,
Also an den Properties kann es eigentlich nicht liegen, denn das hier funktioniert:
Delphi-Quellcode:
Schau lieber mal dort nach:
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; Zitat:
Gruß Neutral General |
Re: BoolToStr wirft Memcheck Exception.
Zitat:
Hast Du noch eine Idee? Gruß, Christoph |
Re: BoolToStr wirft Memcheck Exception.
Mal eine Frage, warum der Umweg über die Public-Property ? Ich würde statt
Delphi-Quellcode:
dieses hier schreiben
BoolToStr(aTestProject.NumberWithZero, true)
Delphi-Quellcode:
BoolToStr(fNumberWithZero, true)
|
Re: BoolToStr wirft Memcheck Exception.
Zitat:
Delphi-Quellcode:
Daher der Zugriff auf alle public properties des Objektes für das Speichern. Hältst Du das für falsch?
function SaveProjectDataToFile(aTestProject: TTestProject): boolean;
Gruß, Christoph |
Re: BoolToStr wirft Memcheck Exception.
Zitat:
Funktioniert es denn, wenn Du es abänderst, wie ich es geschrieben habe ? Edit: Deine Proberty schreibt und liest doch den Wert fNumberWithZero, warum sollte es nicht funktionieren ? |
Re: BoolToStr wirft Memcheck Exception.
Zitat:
Diese Eigenschaften des Objektes werden dann in der Save-function als Werte in eine INI-Datei geschrieben. Daher ist kein Zugriff innerhalb der function auf private Eigenschaften des übergebenen Objektes möglich. Dann müsste ich die fAttribute public machen und auf Set/Get-Methoden der Properties verzichten. Das macht für mich keinen Sinn wenn ich hier kapseln möchte. Hilft diese Erklärung zum besseren Verstehen?
Delphi-Quellcode:
Gruß,
type
TTestProject = class(TObject) private { Private declarations } fName: string; // name des projektes fNumberWithZero: boolean; // sollen nach dem prefix der nummernbereich mit nullen aufgefüllt werden? ... // methoden procedure Set_NumberWithZero(aNumberWithZero: boolean); function Get_NumberWithZero: boolean; ... public { Public declarations } // properties property Id: string read Get_IdStr; property Name: string read fName write fName; property NumberWithZero: boolean read Get_NumberWithZero write Set_NumberWithZero; ... // konstruktor etc... constructor Create; overload; destructor Destroy; override; end; Christoph |
Re: BoolToStr wirft Memcheck Exception.
Irgendwie verstehe ich das nicht ganz. Im Beitrag 3 haste noch diese Zeile geschrieben :
Delphi-Quellcode:
Jetzt soll die Zeile so heissen :
property NumberWithZero: boolean read fNumberWithZero write fNumberWithZero;
Delphi-Quellcode:
Was ist denn nun richtig ?
property NumberWithZero: boolean read Get_NumberWithZero write Set_NumberWithZero;
Ein Memory Leak ist ja nichts anderes, Du hast Speicher reserviert und gibst diesen nicht wieder frei. Dieses muss ja innerhalb der Ermittlung von der Property NumberWithZero passieren. Zum Beispiel :
Delphi-Quellcode:
Bei dieser Procedure wird auch ein Memory Leak angezeigt für die Stringliste.
procedure TForm1.Button1Click(Sender: TObject);
var numbers : TStringList; begin numbers := TStringList.Create; numbers.Add('Testeintrag 1'); end; Edit: Hast Du schonmal mit EurekaLog das ganze untersucht. Eurekalog zeigt Dir den ganzen Weg auf, von da wo es auftritt, bis zum Ursprung. |
Re: BoolToStr wirft Memcheck Exception.
Hast du evtl. Compileroptimierungen an? Darauf reagiert AFAIK MemCheck allergisch.
Ich würde eh FastMM verwenden. Vorteile zu MemCheck: - Zusätzlich besserer Memory Manager - Wird noch aktiv weiterentwickelt. |
Re: BoolToStr wirft Memcheck Exception.
Zitat:
Zitat:
Delphi-Quellcode:
als Code haben. Dann meckert Memcheck in der Zeile:
procedure TForm1.Button1Click(Sender: TObject);
var test : boolean; begin test := BoolToStr(Sender.IsChild, true); end;
Delphi-Quellcode:
test := BoolToStr(Sender.IsChild, true);
Zitat:
|
Re: BoolToStr wirft Memcheck Exception.
Zitat:
Danke für den Tipp mit FastMM. Funktioniert das auch mit Delphi 7 und wo kann ich ein Tutorial dazu finden? Gruß, Christoph |
Re: BoolToStr wirft Memcheck Exception.
Zitat:
![]() |
Re: BoolToStr wirft Memcheck Exception.
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz