【问题标题】:Memory leak using RemObjects and COM Objects over Delphi在 Delphi 上使用 RemObjects 和 COM 对象的内存泄漏
【发布时间】:2012-12-13 22:04:45
【问题描述】:

我有一个使用 RemObjects SDK 在 Delphi XE 上创建的 web 服务,并且发布了一个函数来完成他的工作需要使用 com 对象(特别是 Ado 使用 DMO 连接到数据库)。我发现当我多次调用此函数时,使用 Web 服务的内存会急剧增加。

内存泄漏的原因是为com对象保留的内存没有释放。

我必须做些什么来解决这个问题?

谢谢

代码:

constructor TA.Create;
begin
    inherited Create;
    oServer := CoSQLServer.Create;
end;

destructor TA.Destroy;
begin
   oServer := nil;
end;

声明

class function CoSQLServer.Create: _SQLServer;
begin
    Result := CreateComObject(CLASS_SQLServer) as _SQLServer;
end;

【问题讨论】:

  • 您如何测量内存使用情况?解决方案似乎很明确 - 您需要释放不再使用的 COM 对象(或者干脆不要全部创建它们;创建一次并重新使用它们)。
  • webservice 上的每个调用都是一个独立的线程。我如何实现 COM 对象?我试图将对象设置为零,但它不起作用
  • 我无法回答这个问题,因为您的问题中没有可用于确定答案的代码。
  • 什么是CoSQLServer?我知道它是一个 COM 对象,但它指向的 COM 类是什么?
  • 导入Microsoft SQLDMO对象库的COM对象

标签: delphi com memory-leaks delphi-xe remobjects


【解决方案1】:

在你展示的代码中,我们唯一可以批评的是你的析构函数:

destructor TA.Destroy;
begin
  oServer := nil;
end;

nil 分配给oServer 相当没有意义(尽管无害),因为这会自动发生。

但是这里缺少的是对继承的析构函数的调用。所以,你的析构函数应该是这样的:

destructor TA.Destroy;
begin
  oServer := nil;
  inherited;
end;

现在,如果您决定删除 oServer 的终结,那么您可以简单地从您的类中删除析构函数并依赖基类的析构函数。

但是,您似乎确实在使用无效工具测量内存泄漏。您无法使用任务管理器测量内存泄漏。使用 FastMM 检漏仪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 2018-04-27
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多