Pertanyaan Delphi XE memori bocor dalam metode TWSDLLookup.Destroy


Saya menggunakan Delphi XE. Saya menemukan masalah kebocoran memori menggunakan Delphi Soap. Ternyata karena ada panggilan yang hilang. Gratis di TWSDLLookup.Destroy, seperti yang dijelaskan dalam QC 91160

Masalah yang saya miliki adalah pekerjaan yang dijelaskan, yang hanya untuk ditambahkan FLookup.Free ke TWSDLLookup.Destroy metode.
 Saya tidak ingin mengubah sumber Delphi, jadi saya mencoba menyalin unit ke folder proyek saya, membuat perubahan dan mengkompilasi ulang, seperti yang dijelaskan sini dalam jawaban Tom. Masalah dengan teknik ini adalah itu tampaknya hanya berfungsi jika Anda juga mengkompilasi ulang semua unit dependen. Saya telah mencoba menyalin saja WSDLLookup.pas ke direktori proyek saya dan saya mendapatkan kesalahan Stackoverflow. Saya tidak akrab dengan Layanan Web / SOAP jadi saya tidak tahu apa unit lain yang harus saya salin jika saya menggunakan teknik ini.

Jawaban Rob Kennedy pada halaman yang sama menjelaskan teknik yang berbeda yang melibatkan kode hooking - tetapi tampaknya tidak berlaku untuk metode objek. Saya telah melakukan apa yang dia sarankan dan mengunduh kode gratis untuk TNT Unicode mengontrol dan menempatkan prosedur yang relevan, tetapi saya tidak dapat menemukan informasi tentang cara mengaitkan metode objek - jika memang ini mungkin. Jika saya bisa melakukan ini, saya akan mengaitkannya TWSDLLookup.Destroy dan tambahkan FLookup.Free panggilan.

Setiap ide untuk cara memperbaikinya akan sangat dihargai. Saya sedikit programmer pemula jadi saya berharap saya melewatkan sesuatu yang jelas?


5
2017-10-31 10:35


asal


Jawaban:


Apa yang Anda coba lakukan sebenarnya bekerja dengan baik. Saya menguji sendiri. Ini file proyek yang saya gunakan:

program WSDLLookupTest;

{$APPTYPE CONSOLE}

uses
  WSDLLookup in 'WSDLLookup.pas';

var
  intf: IInterface;

begin
  intf := GetWSDLLookup as IInterface;
end.

Saya membuat salinan dari WSDLLookup.pas file dan menempatkannya di direktori yang sama dengan file .dpr. Kemudian, di salin dan bukan yang asli, saya memodifikasi TWSDLLookup.Destroy.

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

Saya menambahkan Beep untuk membuktikan pada diri sendiri bahwa kode ini memang sedang dieksekusi.

Dalam posisi Anda, saya pasti akan menggunakan solusi ini daripada mencoba kait kode. Dan tentu saja solusi sederhana lainnya adalah meng-upgrade ke versi Delphi yang lebih baru.

Satu hal yang harus diperhatikan adalah mengingat untuk menghapus unit yang dimodifikasi ketika Anda melakukan upgrade. Kebocoran itu diperbaiki di XE2.


3
2017-10-31 10:49