AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi CE 12: constructor und Free vertragen sich nicht mit den destructor ?
Thema durchsuchen
Ansicht
Themen-Optionen

CE 12: constructor und Free vertragen sich nicht mit den destructor ?

Ein Thema von paule32.jk · begonnen am 6. Aug 2024 · letzter Beitrag vom 7. Aug 2024
 
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#1

CE 12: constructor und Free vertragen sich nicht mit den destructor ?

  Alt 6. Aug 2024, 17:27
Hallo,
ich habe folgenden Code:

Delphi-Quellcode:
{$APPTYPE CONSOLE}
program fpcqt;

uses Windows, SysUtils;

var
  DLLHandle: HMODULE;

type
  TMyFunction = procedure(s: PChar; v: DWORD); cdecl;
  TCTOR_QChar = function(s: PChar): uint64; cdecl;
  TDTOR_QChar = procedure(v: uint64); cdecl;
var
  MyFunction: TMyFunction;

  CTOR_QChar: TCTOR_QChar;
  DTOR_QChar: TDTOR_QChar;

type
  QChar = class
  private
    ptr_cc: uint64;
  public
    constructor Create;
    destructor Destroy;
  end;

var
  myQChar: QChar;

constructor QChar.Create;
begin
  ptr_cc := CTOR_QChar(PChar('ctor_QChar'));
  WriteLn(Format('ctor1 ptr: %x',[ptr_cc]));
end;

destructor QChar.Destroy;
begin
  WriteLn('ende');
  WriteLn(Format('dtor1 ptr: %x',[ptr_cc]));
  DTOR_QChar(ptr_cc);
  WriteLn(Format('dtor2 ptr: %x',[ptr_cc]));
end;

function check_dllfun(name: String): Pointer;
var p: Pointer;
begin
  p := GetProcAddress(DLLHandle, PChar(name));
  if p = nil then
  begin
    MessageBox(0,
    PChar('Error: Function not found in DLL.' + #13 + name),
    PChar('Error'),
    MB_OK);
    ExitProcess(1);
  end else
  begin
    result := p;
  end;
end;

begin
  DLLHandle := LoadLibrary('fpc-qt.dll');
  if DLLHandle = 0 then
  begin
    MessageBox(0,'Error: DLL could not be loaded.','Error',0);
    ExitProcess(1);
  end;
  try
    @MyFunction := GetProcAddress(DLLHandle, 'addsymbol');

    @CTOR_QChar := check_dllfun('ctor_QChar');
    @DTOR_QChar := check_dllfun('dtor_QChar');

    MyFunction(PChar('jukel'), 2);
    WriteLn('ooo');

    myQChar := QChar.Create;
    myQChar.Free; // hier
    WriteLn('oooo');
  finally
      FreeLibrary(DLLHandle);
      ExitProcess(0);
  end;
end.
- wenn ich den constructor QChar.Create aufrufe, dann wird der Delphi CTOR aufgerufen.
- wenn ich aber den destructor durch die Anweisung myQChar.Free; aufrufen möchte, wird der DTOR nicht aufgerufen.
- wenn ich aber den destructor direkt aufrufe, mittels: myQChar.Destroy; wird der DTOR von Delphi aufgerufen.

Hat sich da was geändert, an der Programmierreihenfolge ?
Also, das Free nicht mehr für das "aufräumen" verwendet werden kann ?
wo liegt mein Fehler ?
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
 


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 15:22 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