-1

我们正在尝试使用 TAmazonConnectionInfo 和 TAmazonStorageService 演示连接 Amazon AWS S3。连接完美。我们可以列出存储桶、列出存储桶文件以及下载和上传文件……但是 EureakLog 使用 AWS S3 演示报告了内存泄漏。Marko Cantu 的原始演示在 FormCreate 中创建了 TAmazonStorageService,但没有在 FormDestroy 中处置 TAmazonStorageService。

观察到内存泄漏后,我们将 TAmazonStorageService 设置为 nil,然后在 FormDestroy 中释放它,但 EurekaLog 仍然报告内存泄漏并指向 s3Service := TAmazonStorageService.Create(AmazonConnectionInfo1);

这里有什么问题吗?是否必须处理其他东西以防止内存泄漏?

procedure TS3ClientForm.FormCreate(Sender: TObject);
begin
  AmazonConnectionInfo1.AccountName := 'XXXXXXXXXXXXXXXXXXXXXX';
  AmazonConnectionInfo1.AccountKey := 'KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK';
  Caption := AmazonConnectionInfo1.StorageEndpoint;
  { Create an s3Service }
  s3Service := TAmazonStorageService.Create(AmazonConnectionInfo1);
end;

procedure TS3ClientForm.FormDestroy(Sender: TObject);
begin 
  { Free the s3Service }
  s3Service := nil;
  s3Service.Free;
end;
4

1 回答 1

4
s3Service := nil;
s3Service.Free;

这些线是错误的方式。第一行泄漏。第二个什么都不做,因为引用是nil. 只需颠倒这些行的顺序。

s3Service.Free;
s3Service := nil;

或使用FreeAndNil,

FreeAndNil(s3Service);

或者只是打电话Free

s3Service.Free;

并且不用担心将引用设置为nil.

于 2014-11-08T15:03:00.287 回答