读书人

问一个有关std:list的有关问题

发布时间: 2013-06-26 14:29:32 作者: rapoo

问一个有关std::list的问题
有一个全局变量std::list<NODE> gList,其中NODE是结构体
struct
{
int len;
char* msg;
}NODE;
我像如下这样添加元素可以吗?
void add()
{
NODE p;
p->len=5;
p->msg=new char[6];
strcpy(p->msg,"hello");
gList.push_back(p);
}

这样问的原因是p是局部变量,这样添加在add方法之外能不能正常访问元素?还是一离开ad
[解决办法]
可以list中保存的是 p的一个拷贝
[解决办法]
啥也不说,自己看代码



typedef struct
{
int len;
char* msg;
}NODE;

list<NODE>gList;

void add()
{
NODE p;
p.len=5;
p.msg=new char[6];
strcpy(p.msg,"hello");
gList.push_back(p);
}
void main()
{
add();
list<NODE>::iterator iter=gList.begin();
list<NODE>::iterator end=gList.end();
for (;iter!=end;iter++)
{
cout<<(*iter).len<<endl;
cout<<(*iter).msg<<endl;
}
}

[解决办法]
NODE结构体没有显示拷贝构造和赋值操作符,编译器会使用缺省进行位拷贝。
void add()
{
NODE p;
p->len=5;
p->msg=new char[6];
strcpy(p->msg,"hello");
gList.push_back(p); // 保存的是p的拷贝,木有问题。其他地方是可以直接访问list成员的,注意最后gList.clear()之前先delete []每个msg即可。
}
[解决办法]
给std::list push_back使用的是拷贝赋值
只要你add函数出来时没有delete []p->msg;
那么list中那个结构体元素里面的msg也是指向那个堆空间 也就能使用

读书人网 >C语言

热点推荐