STL中是否有基于malloc / free的分配器?如果没有,有没有人知道一个简单的复制/粘贴?我需要一张不能调用new / delete的地图。
答案 0 :(得分:11)
首先,我注意到更改地图本身的分配器不会更改在地图中存储的对象所使用的分配。例如,如果您执行以下操作:
std::map<std::string, int, my_allocator<std::pair<const std::string, int> > m;
当映射中的std::string
分配内存时,映射本身将使用指定的分配器但是分配内存,它们仍将使用默认分配器(将使用{{ 1}}和new
。因此,如果您需要一般避免delete
和new
,则必须确保不仅地图本身使用正确的分配器,而且还要确保任何对象它的商店做同样的事情(我知道这可能说得很明显,但我忽略了它,所以也许值得一提)。
使用该附带条件,使用代码:
delete
并且,一点测试代码:
#ifndef ALLOCATOR_H_INC_
#define ALLOCATOR_H_INC_
#include <stdlib.h>
#include <new>
#include <limits>
namespace JVC {
template <class T>
struct allocator {
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type;
template <class U> struct rebind { typedef allocator<U> other; };
allocator() throw() {}
allocator(const allocator&) throw() {}
template <class U> allocator(const allocator<U>&) throw(){}
~allocator() throw() {}
pointer address(reference x) const { return &x; }
const_pointer address(const_reference x) const { return &x; }
pointer allocate(size_type s, void const * = 0) {
if (0 == s)
return NULL;
pointer temp = (pointer)malloc(s * sizeof(T));
if (temp == NULL)
throw std::bad_alloc();
return temp;
}
void deallocate(pointer p, size_type) {
free(p);
}
size_type max_size() const throw() {
return std::numeric_limits<size_t>::max() / sizeof(T);
}
void construct(pointer p, const T& val) {
new((void *)p) T(val);
}
void destroy(pointer p) {
p->~T();
}
};
}
#endif
答案 1 :(得分:0)
事实上,正如@MichaelBurr所说,Lavavej的'mallocator'是你正在寻找的。我今天在@Arnaud的this answer中获得了更新和漂亮的代码,看看吧。