Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2274
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 27.04.18 22:10 
Ich flehe dich an, gib das Klassenobjekt (v1) mit .Free() frei. :flehan: Du brauchst die Freigabe nicht neu erfinden!

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Symbroson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 381
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Fr 27.04.18 22:12 
Ja ist ja gut ^^ es ging mir wie gesagt nur darum, eine einheitliche Freigabe-Funktion zu haben
An der Warnung ändert es aber nichts.

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2274
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 27.04.18 22:17 
Was für eine Warnung? An welcher Stelle?

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Symbroson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 381
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Fr 27.04.18 22:19 
Von FastMM4 während des Beendens (vor Schließung der Konsole/des Ausgabefensters) dass ein TVec3 Objekt nicht freigegeben wurde, wenn ich v2 nicht am Ende manuell auf nil setze.

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2274
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Sa 28.04.18 04:13 
user profile iconFrühlingsrolle hat folgendes geschrieben:
Was für eine Warnung?

Wie lautet der Textinhalt jener Warnung, die von FastMM4 in deiner Anwendung ausgeben wird?
user profile iconFrühlingsrolle hat folgendes geschrieben:
An welcher Stelle?

Welche Zeile im Source-Code deiner Anwendung wird bemängelt und was steht in jener Zeile geschrieben?

Auf einen Selbstversuch mit FastMM4, deiner Klasse und deinem Beispiel (mit meinen Verbesserungsvorschlägen) komme ich zu dem Entschluss, dass FastMM4 nichts zu bemängeln hat:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var
  v1: TVec3;
  v2: IVec3;
begin
  v1 := TVec3.Create(2,3,5);
  v2 := Vec3(1,4,6);
  try
    v2.x := v2.x + 9.4;
    writeln(Format('2: |(%f|%f|%f)| = %f', [v1.x, v1.y, v1.z, v1.abs]));
    v1.add(v2.copy.mul(4).add(Vec3(5,3,-2))).copy;
    writeln(Format('2: |(%f|%f|%f)| = %f', [v1.x, v1.y, v1.z, v1.abs]));
  finally
    v1.Free;
  end;
  readln;
end;

Außerdem ist deine Code-Formatierung nicht so gut:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
constructor TVec3.Create;                  begin inherited;        fx :=   0; fy :=   0; fz :=   0end;
constructor TVec3.Create(v: TVec3);        begin inherited Create; fx := v.x; fy := v.y; fz := v.z; end;
constructor TVec3.Create(v: IVec3);        begin inherited Create; fx := v.x; fy := v.y; fz := v.z; end;
constructor TVec3.Create(x, y, z: Double); begin inherited Create; fx :=   x; fy :=   y; fz :=   z; end;

Schau' dir bitte dazu den Delphi-Styleguide an. Wäre gut, wenn ich dich nicht erneut darauf hinweisen müsste.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Symbroson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 381
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Sa 28.04.18 08:37 
user profile iconFrühlingsrolle hat folgendes geschrieben:
Was für eine Warnung?

fmm4err


user profile iconFrühlingsrolle hat folgendes geschrieben:
An welcher Stelle?

Es ist keine Delphi Fehlermeldung die eine bestimmte Zeile im Code bemängeln könnte, sondern eine Meldung, ass nach dem Beenden des Programms noch etwas nicht freigegeben wurde. Dass FastMM4 überhaupt den Objekttyp erkennt finde ich schon gut.


user profile iconFrühlingsrolle hat folgendes geschrieben:
Auf einen Selbstversuch mit FastMM4, deiner Klasse und deinem Beispiel (mit meinen Verbesserungsvorschlägen) komme ich zu dem Entschluss, dass FastMM4 nichts zu bemängeln hat

Normalerweise macht es das auch nicht. Du musst dafür die FastMM4Options.inc anpassen. Ich hab hier mal gesammelt was bei bei mir alles eingeschaltet ist:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
{$define UseCustomFixedSizeMoveRoutines}
{$define UseCustomVariableSizeMoveRoutines}
{$define ASMVersion}
{$define DetectMMOperationsAfterUninstall}
{$define FullDebugMode}
  {$define RawStackTraces}
  {$define LogErrorsToFile}
  {$define LogMemoryLeakDetailToFile}
  {$define AlwaysAllocateTopDown}
  {$define SuppressFreeMemErrorsInsideException}
{$define EnableMemoryLeakReporting}
  {$define HideExpectedLeaksRegisteredByPointer}
  {$define ForceMMX}
{$define EnableBackwardCompatibleMMSharing}

EnableMemoryLeakReporting ist auf jeden Fall das Entscheidende.
Für FullDebugMode musste ich noch die FastMM_FullDebugMode.dll in mein Projektordner kopieren - sonst hat die Delphi nicht gefunden.


user profile iconFrühlingsrolle hat folgendes geschrieben:
Außerdem ist deine Code-Formatierung nicht so gut:

Ich möchte mich nur ungern über Formatierung streiten. Ich weiß, dass mehrere Befehle pro Zeile nicht gern gesehen sind. Das ist eh erstmal nur eine komprimierte aber übersichtliche Version (nach dem Motto 'Alles auf einen Blick'), in der ich einfacher etwas hinzufügen kann und gleichzeitig überprüfen, ob die Befehle und rechnungen mit den anderen Overloads übereinstimmen. Falls ich es irgendwann doch mal veröffentlichen möchte, oder irgendwie weitergeben, muss ich sowiso erst noch Kommentieren, und dann wird auch diese gepackte Struktur hinfällig.

Da wäre deine Variante, jeweils auf die (x,y,z)-Funktion zuzugreifen eigentlich nicht verkehrt - nur muss ich dafür erst wieder eine weitere prozedur aufrufen - das kommt mir performancemäßig nicht ganz richtig vor - aber eigentlich ist es vernünftig. Ich glaube, das werde ich übernehmen
Einloggen, um Attachments anzusehen!
_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2274
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Sa 28.04.18 11:03 
Wenn du das hier meinst, dann ja, übernimm' es ruhig. Muss ich mal schauen, woran es liegt. Nicht einmal die ReportMemoryLeaksOnShutdown Eigenschaft schlägt darauf an.

Achja, belasse die Rückgabewerte (TVec3) bei. Es macht keinen Unterschied / Sinn es auf's Interface umzustellen. Wenn man das gegenteilige Objekt braucht, kann man es bei Bedarf entsprechend casten.
Füge daher noch eine weitere Vec3() Methode hinzu:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function Vec3(X, Y, Z: Double): IVec3; overload;
function Vec3(V: TVec3): IVec3; overload;  // NEU

implementation

function Vec3(V: TVec3): IVec3;  // NEU
begin
  result := IVec3(V);
end;

Wird gleich in den verlinkten Beitrag nacheditiert.

Somit kannst du dann auch folgendes umsetzen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
  v1: TVec3;
  v2: IVec3;
begin
  // Variante 1
  v1 := TVec3.Create(1,3,5);
  v2 := IVec3(v1);
  ShowMessage(v2.ToCoordinate); // v1.Free ist hier nicht notwendig. "v1" wurde eine Zeile davor freigegeben.

  // Variante 2
  v1 := TVec3.Create(4,6,8);
  v2 := Vec3(v1);
  ShowMessage(v2.ToCoordinate); // Ebenso.
end;

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)