priority_queue的问题

pacman2000 2004-08-11 02:11:22
priority_queue里放的是自定义的类,这个类又自己会分配空间。
但是跟踪看到重新建堆的时候,发现里面的指针被改变了!所以导致访问的时候出错。

例子如下:
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

class packet
{
public:
int len;
char *data;
public:
packet(const char* buf,int l)
:len(l),data(NULL)
{
data=new char[len];
cout<<"packet(buf,len): this="<<this<<" data="<<(void*)data<<endl;
memcpy(data,buf,len);
}
packet(const packet& p)
:len(p.len),data(NULL)
{
data=new char[len];
cout<<"packet(p): this="<<this<<" data="<<(void*)data<<" ";
p.pthis();
memcpy(data,p.data,len);
}
~packet()
{
cout<<"~packet(): this="<<this<<" data="<<(void*)data<<endl;
delete data;
}
void pthis() const
{
cout<<"pthis(): this="<<this<<" data="<<(void*)data<<endl;
}
friend bool operator<(const packet& p1, const packet& p2);
};

bool operator<(const packet& p1, const packet& p2)
{
return p1.len<p2.len;
}

int main()
{
priority_queue<packet> q;
q.push(packet("hello",5));
q.top().pthis();
}

执行结果为:
packet(buf,len): this=0x8047b70 data=0x8051ce8
packet(p): this=0x8053678 data=0x8051cf8 pthis(): this=0x8047b70 data=0x8051ce8
packet(p): this=0x8047ab0 data=0x8051d08 pthis(): this=0x8053678 data=0x8051cf8
~packet(): this=0x8047ab0 data=0x8051d08
~packet(): this=0x8047b70 data=0x8051ce8
pthis(): this=0x8053678 data=0x8051d08
~packet(): this=0x8053678 data=0x8051d08

也就是说
在push的时候元素是:packet(p): this=0x8053678 data=0x8051cf8
最后在queue里top()的元素是:pthis(): this=0x8053678 data=0x8051d08
data指针怎么会变化呢?
...全文
90 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yjh1982 2004-08-11
嘻嘻.只要有copy construct就要有operator=
黄金般的事实啊.
回复
pacman2000 2004-08-11
呵呵,果然,没想到构建堆的时候是用operator=()的。
看来这些可以缺省的函数还是自己控制的好啊!
回复
yjh1982 2004-08-11
我看了一下msdn.
原来是少了operator=,
好好反省吧....
回复
yjh1982 2004-08-11
gdb?我的VC也有问题,看来问题不在标准库啊.反省代码吧....
回复
pacman2000 2004-08-11
呵呵,改了。 gdb跟踪下来,刚push进去是对的,但是优先队列排序的时候就出现问题了。
回复
yjh1982 2004-08-11
嗯.先吧delete data改为delete[] data吧.再研究....
回复
pacman2000 2004-08-11
第一句:
packet(buf,len): this=0x8047b70 data=0x8051ce8
这个是临时变量的啊。也确实在下面销毁了。
~packet(): this=0x8047b70 data=0x8051ce8
这里的this和data是对应的。

但是,临时变量的copy产生的时候是
packet(p): this=0x8053678 data=0x8051cf8
注意this和data的对应,
下面q.top().pthis()输出的是:
pthis(): this=0x8053678 data=0x8051d08
this是对的,是这个对象,data指针却无缘无故变掉了。
怎么回事呢?
回复
yjh1982 2004-08-11
q.push(packet("hello",5));//其实push进的是临时packet的一个copy
q.top().pthis();//不是上面的packet("hello",5)那已经销毁了
回复
pacman2000 2004-08-11
test...
回复
发帖
工具平台和程序库
创建于2007-09-28

2.4w+

社区成员

C/C++ 工具平台和程序库
申请成为版主
帖子事件
创建了帖子
2004-08-11 02:11
社区公告
暂无公告