C++ Builder 线程 和 窗体的内存 管理

极速小王子 2008-03-03 11:26:54
我做了一个文件搜索程序,主界面上有一个“搜索”按钮。当点击它时,将开启一个线程,进行目录递归搜索。线程中如果搜索到了特定的文件,则将该文件信息在主界面的TListView空间中显示出来,具体过程是这样的:
1.发现指定文件,调用主界面中偶给你的TListView->Items->AddItem()增加一行数据记录,在线程函数的栈中保存新添加的这个记录行TListItem *item;
2.调用主界面类中封装的函数添加文件的其他信息,这些函数调用item->SubItems->Add(data)添加其他文件信息。data是主界面函数的局部变量


现在的情况是这样的:
运行程序,点击搜索,搜索到的文件依次加入列表中。当再次搜索时,主界面会清空列表中的数据,这时候会发生内存释放错误"Invalid pointer..."。

我将在线程中调用item->SubItems->Add()移到了主界面的类中,还是有这样的问题。高手们,设能解答啊?
...全文
102 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
极速小王子 2008-03-03
  • 打赏
  • 举报
回复
问题我已经找到了,谢谢各位!


另外,ydlchina,你哪个判断是多余的,Clear()里面有判断的。
ydlchina 2008-03-03
  • 打赏
  • 举报
回复
TListView fileList-> Clear()

===============
阁下这句是干什么用的,感觉是清除listview中已有各项的,如果是,你可以使用下面代码

if(ListView->Items->Count>0)
ListView->Items->Clear() ;

极速小王子 2008-03-03
  • 打赏
  • 举报
回复
这个返回的TListItem是一个指针,不是实体。
他是通过TListView->Items->AddItem()返回的,其实体应该保存在TListView里面,不应该在线程存储空间里啊!??
小笨象 2008-03-03
  • 打赏
  • 举报
回复
线程函数的栈中保存新添加的这个记录行TListItem *item;
。。。可能问题出在这里。
极速小王子 2008-03-03
  • 打赏
  • 举报
回复
补充一下,就是在开始搜索前,会执行一个TListView fileList->Clear()操作。这个时候会发生如上的现象。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧