Làm việc trên một dự án sử dụng các nhà máy để xây dựng các đối tượng. Tôi giữ các con trỏ đến các chức năng của nhà máy trong các vars trên toàn cầu (xấu tôi biết) và đăng ký chúng khi khởi tạo.Vấn đề bộ nhớ Delphi (FastMM4)
Gần đây tôi đã quan tâm đến việc liệu dự án có rò rỉ bộ nhớ nên quyết định tải xuống FastMM4 và xem qua. Nó xuất hiện với một vài lỗi mà tôi có thể sửa nhưng cái này tôi hơi bối rối vì dường như tôi không giải phóng bộ nhớ liên quan đến nhà máy như thể hiện trong đoạn code dưới đây tôi bị rò rỉ bộ nhớ nhỏ. Tuy nhiên, không phải là vô lý nhưng gây phiền nhiễu.
Tôi sẽ sử dụng gì để giải phóng bộ nhớ (nếu có) tôi đã cố gắng vứt bỏ (@factoryfunction) nhưng dường như mangle mọi thứ. Tôi không quá tốt với những thứ con trỏ ở mức độ thấp luôn làm tôi bối rối vì vậy nếu ai đó có thể giúp điều đó thật tuyệt.
Tôi đã bao gồm một ví dụ bên dưới mà tôi vừa viết ra khỏi đầu của tôi để minh họa sự cố tôi đang gặp phải.
Chúc mừng,
Barry
unit Test;
interface
uses classes;
type
TAFactoryFunction = reference to function (const aType : integer): TObject;
function testfunction (const aType : integer) : TObject;
implementation
function testfunction(const aType: integer) : TObject;
begin
result := TObject.Create;
end;
var
FactoryFunction : TAFactoryFunction
initialization
FactoryFunction := testfunction;
finalization
// possibly some freemem code here?
end.
Tôi tò mò - tại sao bạn sử dụng "tham chiếu đến hàm" thay vì loại chức năng đơn giản? Điều này sẽ tránh rò rỉ bộ nhớ vì nó sẽ không liên quan đến trình biên dịch nhảy qua hoops để đạt được những gì có thể đạt được đơn giản hơn. Hoặc đây có phải là một trong những trường hợp mà ví dụ đơn giản không phản ánh đầy đủ tình huống ban đầu không? – Deltics
giống như sự lỏng lẻo tương đối của việc gõ với nó để biến có thể thực hiện các thủ tục, phương thức hoặc các phương thức nặc danh. Nó đang được sử dụng cho một khuôn khổ vì vậy muốn làm cho nó càng mở rộng càng tốt. – Barry
Tôi không chắc chắn điều này đạt được điều đó, phải không? Tham chiếu vẫn phải là một hàm của chữ ký thích hợp, phải không? Nếu không thì tôi sẽ nói đó là một lý do để tránh những thứ như thế này như bệnh dịch hạch !! nếu tôi tuyên bố một loại như là một chức năng với một chữ ký nhất định sau đó nó vui vẻ tốt hơn được sử dụng như vậy. Bất cứ điều gì khác là yêu cầu cho một nhức đầu bảo trì (chưa kể đến sự nhầm lẫn). Và câu hỏi vẫn còn, tại sao bạn muốn cho phép sự linh hoạt này, khác hơn là vì bạn có thể/muốn? Mục đích linh hoạt phục vụ trong khuôn khổ của bạn là gì? – Deltics