AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

BPL Zugriffsverletzung

Ein Thema von haentschman · begonnen am 20. Jul 2014 · letzter Beitrag vom 20. Jul 2014
Antwort Antwort
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.989 Beiträge
 
Delphi 12 Athens
 
#1

AW: BPL Zugriffsverletzung

  Alt 20. Jul 2014, 19:42
Delphi-Quellcode:
IDVAParser = interface(IInterface)
    ['{7082CCBB-2680-4BC4-8B17-7FFE1D602A0A}']

    procedure ParseDevice(const aText: PChar; DeviceList: TDeviceList);
...
  end;
So ähnlich sieht das bei uns auch aus, allerdings sind das dann nicht Parameter vom Typ TDeviceParameterList sondern vom Typ IInterfacedList<IDeviceParameter>...

Deine Funktionen sehen ja so aus als ob die Objekte nur übergeben und innerhalb der Funktion verwendet werden. Insofern hast du mit dem Lebenszyklus auch keine Probleme (da du Interfaces und Objekte mischst). Allerdings heißt die BPL-Hölle nicht umsonst so. Ganz sorglos mit Objekten werfen kann man da auch nicht.
Allerdings weiß ich das nicht genauer, da ich immer sauber komplett mit Interfaces gearbeitet habe und das Problem daher nie hatte.

Hast du vielleicht einmal einen Stacktrace von einem solchen Fehler und den Quelltext an der Stelle und kannst das zeigen?
Generell:
Wenn irgendwo nil drin steht, wo es nicht drin stehen sollte, würde ich das ganze in Getter und Setter auftrennen und einen Haltepunkt auf den Setter setzen mit "wenn nil übergeben wird" als Bedingung. Alternativ könntest du auch einen Datenhaltepunkt nutzen.

Zitat:
Erstens dürfen in dem Interface selbst keinerlei Objektreferenzen vorkommen.
Wo steht das? Bei DLL kann ich das nachvollziehen. Bei BPL nicht.
Das habe ich ja auch geschrieben, bei BPL geht es. Allerdings macht dann das Interface wenig Sinn, dann kannst du auch gleich konsistent bleiben und ein Objekt zurückgeben. Mischen von Objektreferenzen und Interfaces ist immer schlecht.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.441 Beiträge
 
Delphi 12 Athens
 
#2

AW: BPL Zugriffsverletzung

  Alt 20. Jul 2014, 19:47
Zitat:
dann kannst du auch gleich konsistent bleiben und ein Objekt zurückgeben
...sind viele verschiedene Objekte da der Parser sich in der Funktion unterscheiden kann (Text unterschiedlich) Deshalb das Interface. Der Thread arbeitet mit dem Interface. Da ist es wurscht ob Tbla oder TBlubb hinten dran hängt.

Meinst du wenn ich statt der Objektliste eine Interface Liste übergebe und die (zu ergänzenden) Interfaces der im Parser erzeugten Objekte hineinlege habe ich weniger Probleme?
Zitat:
Hast du vielleicht einmal einen Stacktrace von einem solchen Fehler
...nicht als Bild. Die letzte Zeile vor einer der Zugriffsverletzungen war:
Delphi-Quellcode:
procedure TXWebBaseParser.ParseAlarm(const aText: PChar; AlarmList: TAlarmList);
var
  aAlarm: TAlarm;
  I, PositionFirst, PositionCount, TempPosition: Integer;
  sl: TStringList;
begin
  AlarmList.Clear; //<- hier. Klingt als wäre die Objektliste nicht existent. Diese wird aber beim Erzeugen des Threads erzeugt und im Destroy freigegeben.
  sl := TStringList.Create;
.
.
...deshalb vermute ich die Fehler in der Speicherverwaltung weil ich mit den Objekten nicht richtig umgehe. Mich interessiert halt wie es richtig geht. Deine Variante, grundsätzlich alles mit Interfaces, werde ich mal ausprobieren. Leider erst nächstes Wochenende.

Danke...

Geändert von haentschman (20. Jul 2014 um 19:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.989 Beiträge
 
Delphi 12 Athens
 
#3

AW: BPL Zugriffsverletzung

  Alt 20. Jul 2014, 20:15
Klingt als wäre die Objektliste nicht existent. Diese wird aber beim Erzeugen des Threads erzeugt und im Destroy freigegeben.
FreeOnTerminate nutzt du aber hoffentlich nicht, oder? Denn dann dürftest du auf das Threadobjekt nicht von außen zugreifen.

Das würde das aber direkt erklären.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.441 Beiträge
 
Delphi 12 Athens
 
#4

AW: BPL Zugriffsverletzung

  Alt 20. Jul 2014, 20:37
Der Thread hält die Instanzen der Objektlisten und übergibt sie dem Parser ParseAlarm(const aText: PChar; AlarmList: TAlarmList) Die kann nicht nil sein.
Wenn ich die Klasse direkt instanziere ist ja Alles in Ordnung. Deswegen tippe ich auf ein falsches Abbiegen im Speicher.

Nachtrag: FreeOnTerminate benutze ich nicht.

Geändert von haentschman (20. Jul 2014 um 21:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.989 Beiträge
 
Delphi 12 Athens
 
#5

AW: BPL Zugriffsverletzung

  Alt 20. Jul 2014, 22:34
Dann bleibt noch FastMM versuchen und eben Haltepunkte mit der Bedingung, dass die Variable nil ist.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 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