template <class T>
class container
{
typedef list<T> ObjectList;
public:
~container ()
{
for (typename ObjectList::iterator item = _Container.begin(); item != _Container.end(); item++)
{
if (*item)
delete (*item)
}
}
}
如何通过删除指针内容来释放容器项? g ++不允许使用此代码
答案 0 :(得分:3)
让我们看看:
永远不会宣布_Container
。
delete(*item)
需要一个分号。
您不需要在delete
之前测试指针 - 您可以删除0。
您必须确保T
是指针类型。
不要使用这样的原始指针 - 最好使用一些好的智能指针。
答案 1 :(得分:3)
不要尝试自己动手并使用Boost Pointer Container。
答案 2 :(得分:1)
你没有。
template<typename T>
class container {
typedef list<T> list_t;
list_t container_;
// no user-defined destructor needed
};
成员“container_”自行管理其元素。
但是,如果要存储指向动态分配对象的指针并让容器采用“所有权”(loadilibity to delete),则可以遍历列表并在每个元素上调用delete。但是,您还需要考虑将此容器对象复制或分配给另一个容器对象时应该发生的事情!副本将共享相同的副本,一些元素可能会被删除两次!
顺便说一句:你不应该使用以下划线开头的名字。这些名字是保留的。
答案 3 :(得分:1)
或者您可以使用为您完成所有艰苦工作的boost ptr容器。
http://www.boost.org/doc/libs/1_40_0/libs/ptr_container/doc/ptr_list.html
答案 4 :(得分:0)
您不希望这样做 - 容器(在您的情况下为ObjectList)拥有它包含的项目,因此要删除它们,您需要告诉它你想要什么,如:ObjectList.erase(item);
。由于您(显然)删除了所有项目,因此您可以使用:ObjectList.clear();
并完全跳过使用显式循环。
然后再说一遍,因为ObjectList显然是一个std :: list,所以你不需要做任何上面的操作 - 当你破坏std :: list时,它会自动销毁它包含的任何对象。
编辑:(主要是响应UncleBens的评论):如果你正在尝试创建一个指针容器来管理删除它包含的指针所指向的项目,那么你要做的第一件事是确保它确实包含指针:
template <class T>
class container {
typedef typename std::list<T>::iterator it;
std::list<T *> items; // Note 'T *' rather than just "T"
public:
~container() {
for (it p=items.begin; it!=items.end(); ++it)
delete *it; // *it yields a pointer from the container.
}
};
答案 5 :(得分:0)
- 有拼写错误
- 您正在尝试删除哪个不是指针
希望这对你有用!!!
template <class T>
class container
{
public:
typedef list<T*> ObjectList;
~container ()
{
for (ObjectList::iterator item = _Container.begin(); item != _Container.end(); item++)
{
if (*item)
delete (*item);
}
}
ObjectList _Container;
};
答案 6 :(得分:0)
目前还不清楚你要实现的是什么,但如果你试图创建一个容器来存储指针到对象(而不是自己存储对象),那么更好的技术将是制作一个智能指针容器(特定种类的智能指针取决于你的意图)。这将自动处理对象生命周期管理。