Einzelnen Beitrag anzeigen

idontknow

Registriert seit: 21. Apr 2008
Ort: Schleswig-Holstein
60 Beiträge
 
Delphi 11 Alexandria
 
#1

Pointer auf Instanz zurückgeben

  Alt 8. Mai 2022, 17:46
Delphi-Version: 5
Moin.

Ich stell mich gerade zu blöd an, finde aber den Fehler nicht:

Ich versuche gerade, mir von einer Prozedur einen Zeiger auf ein in der Prozedur erzeugtes Objekt zurückgeben zu lassen.

Offenbar zeigt der Zeiger unmittelbar nach Rückkehr auf das Objekt mit dem richtigen Inhalt (1234).

Sobald dann ein neues Objekt (egal was) erzeugt wird, wird offenbar mein in der Prozedur erzeugtes Objekt überschrieben.

Die Freigabe des Objekts endet sogar in einer Schutzverletzung, offenbar wurde das Ding schon freigegeben. Aber durch wen und wieso?

Hat jemand eine Idee?

PS: Als erste Zeile steht "Delphi-Version: 5". Hab ich nicht geschrieben, steht auch nicht in meinem Profil, glaube ich... Keine Ahnung wie das dahin kommt.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TMyClass = class
  public
    Wert: integer;
  end;
  PMyClass = ^TMyClass;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure Test(var Zeiger: PMyClass);
var
  MyObject: TMyClass;
begin
  MyObject := TMyClass.Create;
  MyObject.Wert := 1234;
  Zeiger := @MyObject;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  pObjekt: PMyClass;
  AnderesObjekt: TMyClass;
begin
  Test(pObjekt);
  Caption := pObjekt^.Wert.ToString; // OK, 1234

  AnderesObjekt := TMyClass.Create;
  AnderesObjekt.Wert := 9876;

  Caption := pObjekt^.Wert.ToString; // Nun nicht mehr 1234...

  AnderesObjekt.Free;

  pObjekt^.Free; // AV
end;

end.
Oliver
  Mit Zitat antworten Zitat