c++ - 如果我不遵守无状态自定义分配器教条,会发生最糟糕的情况吗?

标签 c++ memory-management c++11

我需要为 std::对象创建自定义分配器(特别是最初是为 std::vector),但它最终可能会使用其他分配器

我需要创建自定义分配器的原因是我需要跟踪应用程序各个组件分配的(堆和堆栈)资源(这是应用程序的固有特性)。我将需要自定义分配器来监视资源的堆部分,因此我必须能够向 std::vector 构造函数传递类似于

trackerId idToTrackUsage;
myAlloca<int> allocator(idToTrackUsage);
vector<int> Foo( allocator );

然而,在阅读了一些之后我发现了这个关于 STL/C++ 标准的小炸弹(见引用资料)说给定类型的所有分配器实例应该是等价的(也就是说 == 应该为任何两个实例返回 true)并且,大多数终端;任何分配器都应该能够释放由任何其他实例分配的内存(也就是说,没有办法知道其他实例可能是什么)。简而言之,分配器不能有状态。

所以我正在尝试找到解决这个问题的最佳方法。有什么聪明的主意吗?我真的真的真的不想保留自定义版本的 std::vector。

编辑:我在 http://www2.research.att.com/~bs/C++0xFAQ.html#scoped-allocator 上阅读了有关 c++0x 的作用域分配器的信息。但我无法真正深入了解这如何适用于我的问题。如果有人认为 c++0x 缓解了这个问题,请发表评论

引用资料:

Allocator C++ article in Wikipedia

Some random further reading courtesy of Google

最佳答案

除了明显的答案(“如果您违反任何要求,那是未定义的行为,晚安,感谢您的参与”),我想最坏可能发生的是 vector 实现可以以明显的方式依赖于“分配器类的所有实例都是可互换的”这一要求:

vector(const Allocator &youralloc = Allocator()) {
    const Allocator hawhaw;
    // use hawhaw and ignore youralloc. 
    // They're interchangeable, remember?
}

查看源代码,GCC 的 vector 实现(我认为它最终基于 SGI 的原始 STL 实现)确实存储了传递给该构造函数的分配器对象的拷贝,所以希望这不会发生.

我会说试试看,并记录你所做的非常仔细,这样任何试图在你没有检查过的实现上使用你的代码的人都知道发生了什么在。标准中鼓励实现者放宽对分配器的限制,因此让它们看起来好像放宽了而实际上并没有放宽将是一个肮脏的把戏。这并不意味着它不会发生。

如果您真的很幸运,可以找到一些有关分配器的容器实现文档。

关于c++ - 如果我不遵守无状态自定义分配器教条,会发生最糟糕的情况吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4110292/

相关文章:

c++ - 深度优先搜索 (C++)

pointers - 在子例程中分配数组并将其传回时,FORTRAN 中的内存泄漏问题

c++ - C和C++中的动态内存分配和堆有什么区别

c++为什么在将字符串文字传递给函数时分配内存?

c++ - ld : symbol(s) not found for architecture x86_64 error

c++ - Lambda 捕获和内存管理

c++ - 是否有可能 static_assert lambda 不是通用的?

C++ 静态和动态数组初始化

C++ - 数组的名称和起始地址

c++ - new struct{} 的列表初始化是否使用特定于编译器的变量?