如何显式调用 std 迭代器的析构函数?
How do I explicitly call the destructor of std iterators?
给定 std::vector<A>::iterator
和 std::map<A, B>::iterator
,我如何显式调用它们的析构函数?我不知道这些类型的实际名称,因为 ::iterator
成员类型是 typedefs/aliases 到特定于实现的 类.
我问这个问题,因为我将这些迭代器存储在不受限制的 c++ 联合中,Visual Studio 要求我手动处理销毁。我 可以 根本不调用活动元素的析构函数并假设迭代器不需要清理,但这种做法很糟糕。
大多数情况下,迭代器只不过是指向已分配内存的指针。除非迭代器是使用 new
创建的
typedef std::vector<A>::iterator VecIter;
VecIter* iter= new VecIter;
不需要删除。如果您正在使用 new,那么您可以为迭代器变量显式调用 delete。
delete iter;
像这样:
// let iter be vector<int>::iterator to be destroyed
iter.std::vector<int>::iterator::~iterator();
I do not know the actual names of these types, because the ::iterator member types are typedefs/aliases to implementation-specific classes.
没关系。类型别名也是类型名称。
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();
}
std::destroy_at(&iter);
std::destroy
和 friends 是 C+17 的特性。如果你的编译器缺乏支持,那么你自己实现是微不足道的:
template <typename T>
void destroy_at(T* p) {
p->~T();
}
给定 std::vector<A>::iterator
和 std::map<A, B>::iterator
,我如何显式调用它们的析构函数?我不知道这些类型的实际名称,因为 ::iterator
成员类型是 typedefs/aliases 到特定于实现的 类.
我问这个问题,因为我将这些迭代器存储在不受限制的 c++ 联合中,Visual Studio 要求我手动处理销毁。我 可以 根本不调用活动元素的析构函数并假设迭代器不需要清理,但这种做法很糟糕。
大多数情况下,迭代器只不过是指向已分配内存的指针。除非迭代器是使用 new
创建的 typedef std::vector<A>::iterator VecIter;
VecIter* iter= new VecIter;
不需要删除。如果您正在使用 new,那么您可以为迭代器变量显式调用 delete。
delete iter;
像这样:
// let iter be vector<int>::iterator to be destroyed
iter.std::vector<int>::iterator::~iterator();
I do not know the actual names of these types, because the ::iterator member types are typedefs/aliases to implementation-specific classes.
没关系。类型别名也是类型名称。
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(); }
std::destroy_at(&iter);
std::destroy
和 friends 是 C+17 的特性。如果你的编译器缺乏支持,那么你自己实现是微不足道的:
template <typename T>
void destroy_at(T* p) {
p->~T();
}