销毁 std::vector 中的对象
Destroy object in std::vector
我不想在不丢失内存的情况下销毁任何对象:
from:
`--------+--------+--------`
| item 1 | item 2 | item 3 |
`--------+--------+--------`
to:
`--------+--------+--------`
| item 1 | empty | item 3 |
`--------+--------+--------`
使用过的 std::vector<T>::erase
是最接近它的,但它不允许我访问旧的“内存”:
`--------+--------`
| item 1 | item 3 |
`--------+--------`
我试过用std::allocator_traits<T>
,但是没弄明白怎么用它来编译:
using allocator = std::allocator_traits<type>;
using alloc_type = std::allocator_traits<type>::allocator_type;
class MyClass {
public:
MyClass(int i) : m_i(i) {}
~MyClass() = default;
private:
int m_i;
};
int main()
{
std::vector<MyClass, allocator> vec;
vec.emplace_back(0);
// destroy the object but don't rearrange
allocator::destroy(alloc_type, std::addressof(vec[0]));
}
This code doesn't compile
您可能没有破坏向量中的对象。向量最终会销毁所有元素,如果已经销毁了任何元素,则行为将是不确定的。
您 可以 使用 std::aligned_storage
的向量并处理 MyClass
的构造和销毁,而不是 MyClass
的向量自己将对象放到存储中。但我不建议这样做,因为它可能非常具有挑战性,而且微不足道的错误会导致未定义的行为。
如果您的目标是表示“无值”状态,那么标准库中有一个用于此目的的模板包装器:std::optional
。 IE。你可以使用 std::vector<std::optional<MyClass>>
.
我不想在不丢失内存的情况下销毁任何对象:
from:
`--------+--------+--------`
| item 1 | item 2 | item 3 |
`--------+--------+--------`
to:
`--------+--------+--------`
| item 1 | empty | item 3 |
`--------+--------+--------`
使用过的 std::vector<T>::erase
是最接近它的,但它不允许我访问旧的“内存”:
`--------+--------`
| item 1 | item 3 |
`--------+--------`
我试过用std::allocator_traits<T>
,但是没弄明白怎么用它来编译:
using allocator = std::allocator_traits<type>;
using alloc_type = std::allocator_traits<type>::allocator_type;
class MyClass {
public:
MyClass(int i) : m_i(i) {}
~MyClass() = default;
private:
int m_i;
};
int main()
{
std::vector<MyClass, allocator> vec;
vec.emplace_back(0);
// destroy the object but don't rearrange
allocator::destroy(alloc_type, std::addressof(vec[0]));
}
This code doesn't compile
您可能没有破坏向量中的对象。向量最终会销毁所有元素,如果已经销毁了任何元素,则行为将是不确定的。
您 可以 使用 std::aligned_storage
的向量并处理 MyClass
的构造和销毁,而不是 MyClass
的向量自己将对象放到存储中。但我不建议这样做,因为它可能非常具有挑战性,而且微不足道的错误会导致未定义的行为。
如果您的目标是表示“无值”状态,那么标准库中有一个用于此目的的模板包装器:std::optional
。 IE。你可以使用 std::vector<std::optional<MyClass>>
.