如果我不服从无国籍的自定义分配器教条会发生什么?

lur*_*her 5 c++ memory-management c++11

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

我需要创建自定义分配器的原因是我需要通过应用程序的各个组件跟踪分配的(堆和堆栈)资源(这是应用程序的固有功能).我需要自定义分配器来监视资源的堆部分,所以我必须能够传递给std :: vector构造函数

trackerId idToTrackUsage;
myAlloca<int> allocator(idToTrackUsage);
vector<int> Foo( allocator );
Run Code Online (Sandbox Code Playgroud)

然而,在阅读了一下后,我发现了关于STL/C++标准的小炸弹(参见参考资料),说给定类型的所有分配器实例应该是等效的(即= =应该对任何两个实例返回true),并且终奌站; 任何分配器都应该能够释放由任何其他实例分配的内存(也就是说,无需知道其他实例可能是什么).简而言之,分配器不能拥有状态.

所以我试图找到解决这个问题的最佳方法.任何聪明的想法?我真的真的不想保持自定义版本的std :: vector.

编辑:我在http://www2.research.att.com/~bs/C++0xFAQ.html#scoped-allocator上阅读了关于c ++ 0x的作用域分配器,但我真的无法理解这是怎么回事适用于我的问题.如果有人认为c ++ 0x缓解了这个问题,请评论

参考文献:

维基百科中的Allocator C++文章

一些随机进一步阅读谷歌的礼貌

Ste*_*sop 5

除了明显的答案("如果你违反了任何要求,那是未定义的行为,晚安和感谢你玩"),我想可能发生的最坏情况是,vector实施可以依赖于"所有实例"的要求分配器类是可以互换的"以明显的方式:

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

查看源代码,GCC的向量实现(我认为它最终基于SGI的原始STL实现)确实存储了传递给该构造函数的allocator对象的副本,因此有一些希望不会发生这种情况.

我会说尝试看看,并记录你已经非常谨慎地做了什么,这样任何试图在你没有检查的实现上使用你的代码的人都知道发生了什么.标准中鼓励实施者放松对分配器的限制,因此,当它们不是时,它们看起来就像放松一样.这并不意味着它不会发生.

如果你真的很幸运,那么你的容器实现有一些文档可以讨论分配器.