2011-09-29 17 views
7

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. 
+0

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

+0

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

+0

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

Trả lời

5

tôi chỉ thử nghiệm điều này trong Delphi năm 2010 và nó dường như là một lỗi. Trình biên dịch sẽ tạo mã để làm sạch nó, nhưng nó không phải là. Thậm chí viết FactoryFunction := nil, như David đã đề xuất, không hoạt động.

Bạn nên báo cáo điều này trong QC dưới dạng lỗi.

+0

Có vẻ như có thêm một cuộc gọi đến 'IntfCopy' dẫn đến số tham chiếu được đặt thành 2. Không biết tại sao lại như vậy. –