首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

cb6下的队列queue的pop()方法能否自动释放内存,还是仅仅将节点从队列中移出!解决思路

2012-02-09 
cb6下的队列queue的pop()方法能否自动释放内存,还是仅仅将节点从队列中移出!cb6下的队列queue的pop()方法

cb6下的队列queue的pop()方法能否自动释放内存,还是仅仅将节点从队列中移出!
cb6下的队列queue的pop()方法能否自动释放内存,还是仅仅将节点从队列中移出!

我的以下代码执行时有错误!
TheMainForm-> MsgReceiveBuffer-> toSDTS-> CurrentMsgNode   =   TheMainForm-> MsgReceiveBuffer-> toSDTS-> BufferSDTS-> front();
ProtocolDisposeFromSDTS();
TheMainForm-> MsgReceiveBuffer-> toSDTS-> BufferSDTS-> pop();
if(TheMainForm-> MsgReceiveBuffer-> toSDTS-> CurrentMsgNode)
{
      delete   TheMainForm-> MsgReceiveBuffer-> toSDTS-> CurrentMsgNode;
      TheMainForm-> MsgReceiveBuffer-> toSDTS-> CurrentMsgNode=NULL;
}

[解决办法]
> > cb6下的队列queue的pop()方法能否自动释放内存,还是仅仅将节点从队列中移出!

时不时std::queue啊?
pop()只能移除
不能删除释放内存
要自己手动释放
所有的vector,set,list,map,queue,multiset,multimap都不能自己释放
要手动操作
[解决办法]
其实也很简单的
比如
queue <TButton *> pqButton;
queue <TButton *> ::iterator iter;
for(iter = pqButton.begin(); iter != pqButton.end(); ++ iter){
delete (*iter);
}
pqButton.clear();

[解决办法]
你看看call stack,看它调用了哪些函数过程
[解决办法]
要看里面放的是什么了, 如果存的是指针,它当然不会聪明到释放指针所指向的数据啦(它不知道你还要不要用).
不过用Boost的share_ptr和queue配合可以做到自动释放

另外,如果放的是TButton*等VCL控件指针,因为它们的Owner释放时会自动释放它旗下的所有子控件, 这个时候你再试着释放这个指针就会出错了

[解决办法]
if(NULL != pObject)
{
delete pObject;
}

为空判断是必须的
[解决办法]
从代码上看不出你queue里装的是什么东东. 其实这个是指针和实例的区别,如
class A{
int data;
};

queue <A> qa;
A a;
a.data=10;
qa.push(a);
a.data=100;
这样的话qa生成了一个A的实例,也就是现在应该有两个class A的数据, a.data==100; qa里的a.data=10;

queue <A*> qa;
A a;
a.data=10;
qa.push(&a);
a.data=100;
这样实际上只有一个A实例, a.data和qa里的data实际上是一个东东. qa释放时也不会使用delete去删除它.(如果用了那肯定非法了)

热点排行