c++ - c ++如何在自定义容器中正确调用deallocate
问题描述
我创建了一个自定义容器类,如下所示:
template <typename T, typename Alloc=std::allocator<T>>
class container {
...
};
要分配内存,我使用std::allocator_traits<Alloc>::allocate(some_size)
.
我想我也可以只使用Alloc::allocate(some_size)
.
当我想用std::allocator_traits<Alloc>::deallocate(...)
or释放内存时,问题就来了Alloc::deallocate(...)
,因为deallocate
调用 withstd::allocator_traits
不是静态的,需要传递一个分配器对象。
Alloc::deallocate
会起作用,因为它是静态的。
这两种调用分配器的函数有什么区别,为什么std::alloctor_traits<Alloc>::deallocate(...)
不再是静态的?
我的一些真实代码:
template <typename T, typename Alloc>
ring<T, Alloc>::~ring() {
if (__n_items > 0) {
for(reference item : *this) {
item.~value_type();
}
std::allocator_traits<Alloc>::deallocate(__buffer, __size);
}
}
抛出的参数太少会导致缺少分配器实例。
解决方案
的allocate
和deallocate
方法都allocator_traits
需要一个分配器对象。标准库容器被赋予一个分配器实例来存储和使用(通常用户依赖于默认构造函数行为,默认构造这样的分配器)。如果您希望将容器类与有状态分配器一起使用,您也应该这样做;如果您的自定义分配器没有每个实例的状态,您可以根据需要默认构造一个。
推荐阅读
- php - 当我从 laravel 本地上传时,数字海洋 403 被禁止
- javascript - 如何添加用 javascript
- arrays - AsStreams FireDAC 从 MemoryStream 获得 nil 值
- clang - 在 VS 2019 中链接 dpdk 应用程序时出错 - 在哪里可以找到丢失的 per_lcore__lcore_id 符号
- spring-boot - 从数据库中选择查询记录是否需要使用实体注释
- azure - 如何使用 PowerShell 将 Azure 中的 blob 容器条目导出到 SQL Server?
- java - 如何通过 SDK 获取 Kafka 消费者的 ip 地址?
- python - 如何在 Pandas 的查询字符串中引用未命名的列?
- google-sheets - 从 HTM 网格中的 Google 工作表返回记录
- r - 如何在 ggplot ( R studio) 中选择饼图的顺序