请各位近来看看关于图形的析构的问题。很紧急,拜托了!分不够,另外加!!!

Amour81 2005-02-25 09:16:48
TMemoryStream* pms = new TMemoryStream();
BlobField::Read(m_tblPlan, "BackPic", pms);

BkPic=new TPicture();// TPicture* BkPic;
if(pms->Size) BkPic->Graphic=Util::LoadGraphicFromStream(pms);
delete pms;

最后:
if(BkPic) delete BkPic;

最后我删除Bkpic(注意没有删除它的GRAPHIC属性!)



以下是名字空间Util中的定义:
TGraphic* LoadGraphicFromStream(TMemoryStream* MS)
{
TGraphic* pg = NULL;
pg = new Graphics::TBitmap();//这里NEW了但是没有写配套的DELETE
pg->LoadFromStream(MS);
return pg;
}


只这样是不是会发生内存泄露错误呢?因为缺少一个delete。

但是我看帮助上说TPicture相当于一个容器,那是不是只要删除就也就代表删除了其中的pg呢?

如何确实发生泄露的话,应该怎么操作呢?

我这样写:
if(BkPic)
{
delete BkPic->Graphic;
delete BkPic;

}

电脑提示错误:
Access Violation at address 00000044,Read of Address 00000044!!
...全文
111 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Amour81 2005-08-29
  • 打赏
  • 举报
回复
发现问题所在:
在交句柄的时候会发生复制,所以可以用2次DELETE
这样就不会泄露了
pcclever 2005-03-04
  • 打赏
  • 举报
回复
TMemoryStream* pms = new TMemoryStream();
BlobField::Read(m_tblPlan, "BackPic", pms);

BkPic=new TPicture();// TPicture* BkPic;
if(pms->Size) BkPic->Graphic=Util::LoadGraphicFromStream(pms);
delete pms;

最后:
if(BkPic) delete BkPic;

如果这里的BkPic=true,那么delete将不被执行,再执行BlobField::Read(m_tblPlan, "BackPic", pms) 这个函数,那么又会执行BkPic=new TPicture(); 所以有问题了。
kyodan 2005-03-04
  • 打赏
  • 举报
回复
你把句柄交给别人,再把自己删了,当然会Access Violation了
Amour81 2005-03-04
  • 打赏
  • 举报
回复
自己踢一下
Amour81 2005-02-25
  • 打赏
  • 举报
回复
试了一下,FREE还是出现这个问题
呵呵
wilsonloveada 2005-02-25
  • 打赏
  • 举报
回复
如果用Free()呢?
试试看,我曾经也遇到过类似的问题,我帮你找找看我的程序是怎么写的!

13,871

社区成员

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

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