2012-10-31 34 views
5

Tôi đang sử dụng Delphi XE. Tôi đã gặp một vấn đề rò rỉ bộ nhớ bằng cách sử dụng Delphi Soap. Hóa ra là do một thiếu gọi trực tiếp bằng trong TWSDLLookup.Destroy, như mô tả trong QC 91160rò rỉ bộ nhớ XE Delphi trong phương pháp TWSDLLookup.Destroy

Vấn đề mà tôi có là mô tả công việc xung quanh, mà chỉ đơn giản là thêm FLookup.Free với phương pháp TWSDLLookup.Destroy.
Tôi không muốn thay đổi nguồn Delphi, vì vậy tôi đã thử sao chép đơn vị vào thư mục dự án của mình, thực hiện thay đổi và biên dịch lại, như mô tả here trong câu trả lời của Tom. Vấn đề với kỹ thuật này là nó dường như chỉ hoạt động nếu bạn cũng biên dịch lại tất cả các đơn vị phụ thuộc. Tôi đã thử sao chép chỉ WSDLLookup.pas vào thư mục dự án của mình và tôi gặp lỗi Stackoverflow. Tôi không quen thuộc với dịch vụ Web/SOAP vì vậy tôi không biết những gì các đơn vị khác tôi nên sao chép hơn nếu tôi sử dụng kỹ thuật này.

Câu trả lời của Rob Kennedy trên cùng một trang mô tả một kỹ thuật khác có liên quan đến mã hooking - nhưng nó dường như không áp dụng cho các phương thức đối tượng. Tôi đã làm như ông đề nghị và tải về mã miễn phí cho các điều khiển TNT Unicode và đặt các thủ tục có liên quan, nhưng tôi đã không thể tìm thấy thông tin về cách móc một phương pháp của đối tượng - nếu thực sự điều này là có thể. Nếu tôi có thể làm điều này, tôi sẽ móc TWSDLLookup.Destroy và thêm cuộc gọi FLookup.Free.

Bất kỳ ý tưởng nào về cách sửa lỗi này sẽ được nhiều người đánh giá cao. Tôi là một chút của một lập trình viên newbie vì vậy tôi hy vọng rằng tôi đã bỏ lỡ một cái gì đó hiển nhiên?

Trả lời

3

Những gì bạn đang cố gắng làm trong thực tế hoạt động tốt. Tôi đã tự mình thử nghiệm nó. Dưới đây là hồ sơ dự án tôi đã sử dụng:

program WSDLLookupTest; 

{$APPTYPE CONSOLE} 

uses 
    WSDLLookup in 'WSDLLookup.pas'; 

var 
    intf: IInterface; 

begin 
    intf := GetWSDLLookup as IInterface; 
end. 

tôi đã thực hiện một bản sao của tập tin WSDLLookup.pas và đặt nó trong cùng thư mục với file .dpr. Sau đó, trong bản sao thay vì bản gốc, tôi đã sửa đổi TWSDLLookup.Destroy.

destructor TWSDLLookup.Destroy; 
begin 
    Beep; 
    ClearWSDLLookup; 
    FLookup.Free; 
    inherited; 
end; 

Tôi đã thêm Beep để chứng minh bản thân rằng mã này thực sự đang được thực thi.

Ở vị trí của bạn, tôi chắc chắn sẽ sử dụng giải pháp này thay vì thử móc mã. Và tất nhiên, giải pháp đơn giản khác là nâng cấp lên phiên bản Delphi sau này.

Một điều cần lưu ý là phải nhớ loại bỏ đơn vị đã sửa đổi khi bạn nâng cấp. Việc rò rỉ đã được cố định trong XE2.

+0

Cảm ơn bạn đã trả lời nhanh :) –

+0

Tôi thấy điều gì đó về việc có thể sử dụng debug dcus sẽ gây ra sự cố - có thể đó là lý do tại sao tôi bị tràn ngăn xếp của mình. Hoặc có thể tôi có một lỗi khác. –

+0

Dù sao, cảm ơn một lần nữa. Kể từ khi nó hoạt động, tôi sẽ cố gắng tìm hiểu những gì khác tôi đang làm sai :) –