Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 清理C+时出现双重解除锁定问题+;指针列表 问题:_C++_List_Pointers_Stl - Fatal编程技术网

C++ 清理C+时出现双重解除锁定问题+;指针列表 问题:

C++ 清理C+时出现双重解除锁定问题+;指针列表 问题:,c++,list,pointers,stl,C++,List,Pointers,Stl,我试图释放STL列表指针项指向的内存 这应该可以很好地工作,但在我的例子中,列表中可能有重复的指针,即使我测试指针是否为NULL,我也会得到一个double dealloc异常(请参阅下面的源代码)。 我怎样才能解决这个问题 环境: Debian5 Lenny gcc版本4.3.2(Debian 4.3.2-1.1) libc-2.7.so libstdc++.so.6.0.10 Eclipse Galileo构建id:20100218-1602/CDT C++源代码: 您可以创建临时std

我试图释放STL列表指针项指向的内存

这应该可以很好地工作,但在我的例子中,列表中可能有重复的指针,即使我测试指针是否为NULL,我也会得到一个double dealloc异常(请参阅下面的源代码)。 我怎样才能解决这个问题

环境:
  • Debian5 Lenny
  • gcc版本4.3.2(Debian 4.3.2-1.1)
  • libc-2.7.so
  • libstdc++.so.6.0.10
  • Eclipse Galileo构建id:20100218-1602/CDT
C++源代码:
您可以创建临时std::set,用原始容器中的项目填充它,并在循环中删除set的所有项目(set保证我们只有唯一的项目)。
或者您可以将std::unique函数应用于您的容器。

但我建议您使用智能指针(类似于boost::shared\u ptr)。他们将完成有关内存管理的所有工作。

您只创建了一个line对象(只有一个新对象)

但是你删除它两次,因为你把同一个对象放入列表两次

做:

这将只插入两个指向同一引用的指针

delete (*it);
因此,当您为第1行调用此命令时,原始行将丢失。第二行现在将指向解除分配的对象


为什么不直接使用
列表
(不带指针)?这样就避免了新的/
删除
问题,而以按值存储为代价


或者使用中的
shared\u ptr

行分配一次,但添加到列表中两次。第一次删除将释放分配的内存。第二次删除将对此进行投诉。这是完全正常的


考虑使用例如引用计数的智能指针而不是普通指针。

您可以使用智能指针而不是原始指针吗?我会尝试使用boost shared_ptr,如下所示:

#include <boost/shared_ptr.hpp>

list< boost::shared_ptr< Line > > l;
boost::shared_ptr< Line > line( new Line( 10, 10, 10, 10 ) );
l.push_back( line );
l.push_back( line );
#包括
列表>l;
boost::shared_ptrLine(新行(10,10,10,10));
l、 向后推(线);
l、 向后推(线);

当列表被销毁时,清理将删除
对象。

为什么要存储指针?标准容器是为对象设计的。非常感谢,这解决了我的问题!因为我已经在使用libboost了,这很好:)谢谢你的帮助,但是如果通过将指针设置为NULL,我们以后就不会进入这种情况,这是正常的。相反,即使我在下一次迭代中将指针设置为NULL,它仍然认为它不是NULL,不是吗?通过将指针设置为NULL,实际上是将列表的元素设置为NULL。列表中的下一个条目仍将包含非空指针。
Line * line = new Line(10, 10, 10, 10);
l->push_back(line);
line = new Line(10, 10, 10, 10);   // second new
l->push_back(line);
l->push_back(line);
l->push_back(line);
delete (*it);
#include <boost/shared_ptr.hpp>

list< boost::shared_ptr< Line > > l;
boost::shared_ptr< Line > line( new Line( 10, 10, 10, 10 ) );
l.push_back( line );
l.push_back( line );