如何显式调用std迭代器的析构函数?

时间:2017-03-07 11:08:13

标签: c++ std

鉴于std::vector<A>::iteratorstd::map<A, B>::iterator,如何明确调用其析构函数?我不知道这些类型的实际名称,因为::iterator成员类型是特定于实现的类的typedef / aliases。

我问这个问题,因为我将这些迭代器存储在一个不受限制的c ++联合中,Visual Studio要求我手动处理破坏。我可能根本不会调用活动元素的析构函数,并假设迭代器不需要清理,但这种做法很糟糕。

3 个答案:

答案 0 :(得分:3)

像这样:

// let iter be vector<int>::iterator to be destroyed
iter.std::vector<int>::iterator::~iterator();
  

我不知道这些类型的实际名称,因为:: iterator成员类型是特定于实现的类的typedef / aliases。

没关系。类型别名也是类型名称。

LLVM似乎有一个错误:https://bugs.llvm.org//show_bug.cgi?id=12350

在修复之前,作为一种解决方法,引入一个非嵌套别名:

using iterator = std::vector<int>::iterator;
iterator it;
it.iterator::~iterator();

或引用类型作为模板参数(此代码来自错误报告):

template <typename T>
inline void placement_delete(T *x) 
{
   // C++ lacks placement delete, so fake it with a function
   x->~T();
}

答案 1 :(得分:3)

std::destroy_at(&iter);

std::destroy和朋友是C + 17的功能。如果您的编译器缺乏支持,那么实现自己是微不足道的:

template <typename T>
void destroy_at(T* p) {
    p->~T();
}

Source

答案 2 :(得分:0)

大多数情况下,迭代器只是指向已分配内存的指针。除非使用新的

创建迭代器
 typedef std::vector<A>::iterator VecIter;
 VecIter* iter= new VecIter;

无需删除。如果您使用new,则可以显式调用delete for iterator variable。

delete iter;