oti*_*oza 5 c++ memory-management std
对不起,我无法粘贴特定代码.
我希望这个小样本足够了:
假设我有一个像这样的分配器:
template <class T>
class MyAllocator
{
// ... typedefs
MyAllocObject _allocObject;
public:
MyAllocator() {
// _allocObject = new ..
}
MyAllocator(const MyAllocator& alloc) {
_allocObject = alloc.getAllocObject();
}
template <class U>
MyAllocator(const MyAllocator<U>& alloc) {
_allocObject = alloc.getAllocObject();
}
MyAllocator(const MyAllocObject& allocObject) {
_allocObject = allocObject;
}
inline pointer allocate(size_type size) {
return _allocObject->alloc(size);
}
// other functions
};
Run Code Online (Sandbox Code Playgroud)
并使用如下:
MyAllocObject object;
MyAllocator<int> myAlloc(object);
std::list<int, MyAllocator<int> > list(myAlloc);
Run Code Online (Sandbox Code Playgroud)
我经历过,如果缺少默认构造函数,代码就不会编译,所以我添加了它.
但问题是,我依赖于那个论点,因为这就是我用于自定义内存分配的东西.
在这种情况下我该怎么办?
在 C++11 之前,STL 实现允许要求分配器表现得像无状态一样。
“表现得如同无状态”意味着 STL 可以依赖以下内容来工作:
MyAllocator a1;
void * p = a1.allocate(77, 0);
MyAllocator a2;
a2.free(p);
Run Code Online (Sandbox Code Playgroud)
(IIRC 这简化了一些容器操作的实现。)
“were allowed to require”意味着STL实现可以支持有状态分配器(就像你的那样),但不是必须的。
C++ 11 需要支持有状态分配器。
然而,我无法找到对此的快速介绍(有人想添加它吗?)此线程可能会给您一些线索。
如果您绑定到不支持有状态分配器的特定编译器,那么您有一些不那么闪亮的选项:
| 归档时间: |
|
| 查看次数: |
154 次 |
| 最近记录: |