DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: wjy13061029975
今日帖子: 0
在线用户: 5
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 ml0749276 (ml0749276) ▲▲▲▲△ -
普通会员
2015/11/24 23:11:21
标题:
求助,FastMM能用于Delphi控件工程么 浏览:1981
加入我的收藏
楼主:     学生一个,现在在帮老板开发一个Delphi显示控件,但有一处有一个窗体当Free的时候就会出错,要么是地址错误,要么是StackOverflow。这个窗体内部我加了一个对象用来储存我的一些数据,在窗体创建和销毁的方法里创建和销毁这个对象,我在每次Create和FreeAndNil前都会检查对象是否存在的。
    这个报错的问题找了几天一直找不到,在网上搜到了FastMM,说是能记录程序的内存泄露,我就下载,然后加入工程,也打开了FullDebugMode。按网上的步骤吧FastMM配置好了,和网上唯一不同的是我这是控件工程,不生成exe,只是bpl,结果控件在调试的时候它既不提示,当遇到异常退出后也没找到生成的记录文件,所以很疑惑。
    希望能有大神帮忙解答一下。

附我找到的网址  http://blog.csdn.net/fjclc2008/article/details/6679107
----------------------------------------------
-
作者:
男 speedbin (speedbin) ★☆☆☆☆ -
盒子活跃会员
2015/11/25 16:16:24
1楼: 最好能贴出代码,否则很难判断。
----------------------------------------------
-
作者:
男 kinneng (kinneng) ★☆☆☆☆ -
盒子活跃会员
2015/11/25 18:39:32
2楼: 楼主的情况不是内存泄漏问题,概念要搞清楚。

然后,你自己销毁对象内存之后,要设置对象为nil,或者执行FreeAndNil来销毁。

如果你的对象是一个控件,可能已经被顺带销毁了,可以重载窗口的Notification过程来检测,及时设置为nil即可。
----------------------------------------------
声明:本人不在论坛询问任何编程问题,请不要将我的帖子当成问题来回答。炒股一天,编程三年,不浪费时间了。 经常在外面,没空,不要找我..
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2015/11/25 21:06:39
3楼: 先别急着封装 dpk,直接 use pas 到 dpr 编译独立 exe 测试稳定 ok 了在封装,独立的 exe 结合 FastMM4 的 FullDebugMode 无敌啊 ~
----------------------------------------------
-
作者:
男 ml0749276 (ml0749276) ▲▲▲▲△ -
普通会员
2015/11/26 13:21:57
4楼: 之前一直在盒子浏览,没发过贴,也没回过,没找到回复指定人的地方。我这就一起回复了吧。
这个控件是一个利用Opengl的三维显示控件,是老板前一届学生做好了的,现在老板把它给我,要给他扩展功能,所以只能是在控件工程里面debug了。

相关的代码如下
{这段代码用于处理弹出窗体的所有功能}
procedure TMT3DViewControlDerived.CoordDialogPopup();
var
  I: Integer;
begin
  if not Assigned(FCoordinateAxesDialog) then
    FCoordinateAxesDialog := TCoordinateAxesDialog.Create(Self);

  FCoordinateAxesDialog.RectGrid := (FDefaultGridForCurrentM);

  if FCoordinateAxesDialog.Execute then
  begin
    { 更新比例因子 }
    FXmulti := FCoordinateAxesDialog.RectGrid.Xmulti;
    FYmulti := FCoordinateAxesDialog.RectGrid.Ymulti;
    FZmulti := FCoordinateAxesDialog.RectGrid.Zmulti;

    { 设置坐标轴 }
    CoordinateAxes.Xmulti := FCoordinateAxesDialog.RectGrid.Xmulti;
    CoordinateAxes.Ymulti := FCoordinateAxesDialog.RectGrid.Ymulti;
    CoordinateAxes.Zmulti := FCoordinateAxesDialog.RectGrid.Zmulti;
    with FCoordinateAxesDialog do
    begin
      CoordinateAxes.XTicks.GenerateTicks(StrToFloat(XminEdit.Text), StrToFloat(XmaxEdit.Text), 10);
      CoordinateAxes.YTicks.GenerateTicks(StrToFloat(YminEdit.Text), StrToFloat(YmaxEdit.Text), 10);
      CoordinateAxes.ZTicks.GenerateTicks(StrToFloat(ZminEdit.Text), StrToFloat(ZmaxEdit.Text), 10);

      CoordinateAxes.SetVerts(StrToFloat(XminEdit.Text), StrToFloat(YminEdit.Text),
        StrToFloat(ZminEdit.Text), StrToFloat(XmaxEdit.Text), StrToFloat(YmaxEdit.Text),
        StrToFloat(ZmaxEdit.Text));
    end;

    { 更新graphicitem对象 }
    RefreshGraphicItems(FCoordinateAxesDialog.RectGrid, FCoordinateAxesDialog.Maximum,
      FCoordinateAxesDialog.Minimum);

    { 更新PointPickDialog }
    if Assigned(PointPickDialog) and (Assigned(PointPickDialog.PointSelect)) then
      PointPickDialog.PointSelect.BoundRect := FCoordinateAxesDialog.RectGrid.BoundsRect;
  end;

  FCoordinateAxesDialog.Free;
  FCoordinateAxesDialog := nil;
  Invalidate;

end;

{这两段代码是用来在窗体create和destroy的时候来创建和释放窗体里面的对象}
procedure TCoordinateAxesDialog.FormCreate(Sender: TObject);
begin
  if not Assigned(FRectGrid) then
    FRectGrid := TRectGrid.Create;
end;

procedure TCoordinateAxesDialog.FormDestroy(Sender: TObject);
begin
  if Assigned(FRectGrid) then
    FreeAndNil(FRectGrid);
end;

{这个FRectGrid对象的create和destroy如下,FRectGrid是从TObject派生的}
constructor TRectGrid.Create;
begin
  inherited;
  Nx := 0;
  Ny := 0;
  Nz := 0;
  ValueSpecified := False;
end;
destructor TRectGrid.Destroy;
begin
  SetLength(FXCoords, 0);
  SetLength(FYCoords, 0);
  SetLength(FZCoords, 0);
  SetLength(FValues, 0);
  inherited;
end;
----------------------------------------------
-
作者:
男 kinneng (kinneng) ★☆☆☆☆ -
盒子活跃会员
2015/11/26 18:10:30
5楼: 看不懂。
----------------------------------------------
声明:本人不在论坛询问任何编程问题,请不要将我的帖子当成问题来回答。炒股一天,编程三年,不浪费时间了。 经常在外面,没空,不要找我..
作者:
男 qiuyan81 (苦恋树) ★☆☆☆☆ -
普通会员
2015/11/26 18:22:24
6楼: 调试出现异常能跳到代码行啊。。。。
----------------------------------------------
作者:
男 ml0749276 (ml0749276) ▲▲▲▲△ -
普通会员
2015/11/26 19:15:21
7楼: 我单步调试的时候就是到FCoordinateAxesDialog.Free;这里出错的,但我这想不通我这释放的代码写的没问题啊
前面那段代码执行都没问题,就是在Free这里出的问题。
然后我再想在Free那里F7跟进去的时候它就到下一句FCoordinateAxesDialog:=nil去了
----------------------------------------------
-
作者:
男 littlestone08 (littlestone08) ★☆☆☆☆ -
普通会员
2015/11/30 12:42:38
8楼: fastmm只能用在工程中,但也可以发现组件中的泄漏,你说你的没有,是你没配置对,不止一个开关要打开的,公司计算机不能联外网,不方便给你配置文件。
建议你用另一个办法:override FCoodinateAxisDialog的destroy,下断点,看它什么时候被free了
----------------------------------------------
我和我追逐的梦,擦肩而过
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2015/11/30 13:03:32
9楼: EurekaLog
----------------------------------------------
武汉天气不好
作者:
男 hawke2e (hawke2e) ★☆☆☆☆ -
普通会员
2015/11/30 13:15:15
10楼: if FCoordinateAxesDialog.Execute then

FCoordinateAxesDialog是不是一个窗体?  如果是,execute后窗体已经销毁了,你再free肯定不行
----------------------------------------------
软件是什么,相信很多人都说不清。
作者:
男 ml0749276 (ml0749276) ▲▲▲▲△ -
普通会员
2015/12/2 22:55:25
11楼: 对了,那个FCoordinateAxesDialog.Execute的代码贴出来,就是以模态窗口的形式弹出的对话框。

function TCoordinateAxesDialog.Execute(ParentWnd: HWND): Boolean;
begin
  Result := ShowModal = mrOk;
end;

这几天一直在忙别的事,这个问题暂时也没时间继续弄,所以前面楼层各位提到的方法我也还没去试试,在这里先谢过了!
----------------------------------------------
-
作者:
男 ml0749276 (ml0749276) ▲▲▲▲△ -
普通会员
2016/8/19 11:38:51
12楼: 现在把这个控件里面架构按老板要求改了,同时也将上面的坐标轴设置对话框代码一起改过,现在一切运行正常。我估计之前那个死也找不出的错误已经随着我代码逻辑的修改消失于无形了。
谢谢楼上热心回帖的坛友!
----------------------------------------------
-
作者:
男 sspeak (sspeak) ★☆☆☆☆ -
盒子活跃会员
2016/8/20 22:02:52
13楼: FCoordinateAxesDialog := TCoordinateAxesDialog.Create(Self);

owner=self?

我一般owner=nil的.
----------------------------------------------
-
作者:
男 ml0749276 (ml0749276) ▲▲▲▲△ -
普通会员
2016/8/28 13:04:00
14楼: @sspeak
是的,推荐的是设置为nil,自己手动管理窗体的释放,而不要嵌套于owner中遍历管理。我这是刚开始弄的的时候对这些还不了解,所以写的self(在这代码里面就是TMT3DViewControlDerived类),现在基本都改为nil了。
----------------------------------------------
-
作者:
男 sspeak (sspeak) ★☆☆☆☆ -
盒子活跃会员
2016/8/31 20:17:14
15楼: 对啊,owner=self,再FCoordinateAxesDialog.Free;就有可能出现释放2遍的问题.
还有,FCoordinateAxesDialog.Execute,执行完可能自动释放了.
----------------------------------------------
-
作者:
男 ml0749276 (ml0749276) ▲▲▲▲△ -
普通会员
2016/9/11 12:43:13
16楼: @sspeak
嗯,谢了!
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行68.84766毫秒 RSS