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

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!!
...全文
74 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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()呢?
试试看,我曾经也遇到过类似的问题,我帮你找找看我的程序是怎么写的!
回复
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2005-02-25 09:16
社区公告
暂无公告