C++ 清理C+时出现双重解除锁定问题+;指针列表 问题:
我试图释放STL列表指针项指向的内存 这应该可以很好地工作,但在我的例子中,列表中可能有重复的指针,即使我测试指针是否为NULL,我也会得到一个double dealloc异常(请参阅下面的源代码)。 我怎样才能解决这个问题 环境: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
- 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李>
您可以创建临时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 );