的pop_front()函数是否把元素空间给回收了?

Canon_in_D_Major 2017-05-22 12:36:57
小弟不才,只是个小白,很多知识面有缺陷。
今天用Qt写操作系统处理机调度的时候,设了一个的指针指向链表队首元素,之后该元素被pop_front(),按照我的理解,元素被移除,该元素只是跟链表没关系了,但是空间还没有被回收,但是事实是元素被pop_front()后该指针就出错了(运行时崩溃),我注释掉pop_front()那行后,指针能正常使用。
不知道是什么问题,去c-free上想要验证一下,pop_front()有和没有都能正常运行,我也迷糊了,到底是怎么回事?以下是c-free上测试的代码:

#include<list>
#include<iostream>
using namespace std;

class A
{
public:
int data;

A(int x):data(x){}
};

int main()
{
list<A> l;
A a(5);
l.push_back(a);
A* pa = &a;
l.pop_front();
cout<<pa->data<<endl;
return 0;
}
...全文
1174 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻夢之葉 2017-05-22
  • 打赏
  • 举报
回复
list<A> l; A a(5); //push_back是值拷贝,push之后list里面的元素跟a没有半毛钱关系 //(a又不是指针,而且成员也没有指针相关的浅拷贝的内容) l.push_back(a); A* pa = &a; //指向的依旧仅仅是变量a而已 l.pop_front(); //pop掉的也跟a没有半毛钱关系 这个不会出错,除非某些编译器进行bug式的优化 就相当于 A a(5); A *pb = new A; *pb = a; //进行的是值拷贝 delete pb; //就算delete pb,那对a也没影响 A* pa = &a;
Canon_in_D_Major 2017-05-22
  • 打赏
  • 举报
回复
引用 2 楼 CharlesSimonyi 的回复:
A a(5); A* pa = &a; 指针pa指向的是局部变量a 该局部变量在main()函数中都有有效的 push_back只是把a拷贝了一个副本存进去 自然pop_front也和a没有关系了
非常感谢! 原来push_back()自己new了一块空间存放复制的对象啊,非常感谢,学习到了
Canon_in_D_Major 2017-05-22
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
list<A> l; A a(5); //push_back是值拷贝,push之后list里面的元素跟a没有半毛钱关系 //(a又不是指针,而且成员也没有指针相关的浅拷贝的内容) l.push_back(a); A* pa = &a; //指向的依旧仅仅是变量a而已 l.pop_front(); //pop掉的也跟a没有半毛钱关系 这个不会出错,除非某些编译器进行bug式的优化 就相当于 A a(5); A *pb = new A; *pb = a; //进行的是值拷贝 delete pb; //就算delete pb,那对a也没影响 A* pa = &a;
非常感谢,有点明白了。 也就是说,<list>中的push是自己new了一块内存,用复制构造函数复制了一个新的对象进行链接,这个新对象除了值与源对象相同以外,跟它没有任何关系,等pop的时候这个新对象的空间会被delete,而整个过程中跟以前的对象没有任何关系,是这个意思吗?
encoderlee 版主 2017-05-22
  • 打赏
  • 举报
回复
A a(5); A* pa = &a; 指针pa指向的是局部变量a 该局部变量在main()函数中都有有效的 push_back只是把a拷贝了一个副本存进去 自然pop_front也和a没有关系了

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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