首页 > 解决方案 > 销毁 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]));
}

此代码无法编译

标签: c++memoryallocator

解决方案


您可能没有销毁向量中的对象。向量最终会销毁所有元素,如果任何元素已经被销毁,那么行为将是未定义的。

MyClass可以使用 的 向量代替 的向量std::aligned_storage并自己处理对象的构造和销毁MyClass到存储上。但我不建议这样做,因为它可能非常具有挑战性,而且微不足道的错误会导致未定义的行为。

如果您的目标是表示“无值”状态,那么标准库中有一个用于此目的的模板包装器:std::optional. 即你可以使用std::vector<std::optional<MyClass>>.


推荐阅读