c++ - 销毁 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]));
}
此代码无法编译
解决方案
您可能没有销毁向量中的对象。向量最终会销毁所有元素,如果任何元素已经被销毁,那么行为将是未定义的。
MyClass
您可以使用 的 向量代替 的向量std::aligned_storage
并自己处理对象的构造和销毁MyClass
到存储上。但我不建议这样做,因为它可能非常具有挑战性,而且微不足道的错误会导致未定义的行为。
如果您的目标是表示“无值”状态,那么标准库中有一个用于此目的的模板包装器:std::optional
. 即你可以使用std::vector<std::optional<MyClass>>
.
推荐阅读
- flutter - 如何在initState中完成异步操作并更新ui?
- python - 输入合数时出现素数或复合计算器错误
- javascript - 无效的客户 ID - google-ads-api,我提供了正确的 customer_id 集,但它返回错误
- android - 如何在Android中像这样将视图拖动到顶部和底部?
- python - 复制循环中的所有字符串输出(不在列表中)
- python - 如何检查一个字符串不包含只有一个条件的两个不同的子字符串?
- javascript - 如何检查对象类型的原型是否是 Typescript 中的 Object.prototype?
- java - 使用 java 运行 shell 命令,该命令还会在 raspberry pi 中打开终端窗口
- neovim - Neovim,航空公司插件遇到错误。【orz】
- python - 查找大写算法