gpt4 book ai didi

c++ - 基于 malloc/free 的 STL 分配器

转载 作者:可可西里 更新时间:2023-11-01 17:38:19 31 4
gpt4 key购买 nike

STL 中是否有基于 malloc/free 的分配器?如果没有,有人知道简单的复制/粘贴吗?我需要一个不能调用 new/delete 的 map 。

最佳答案

首先,我要注意,更改 map 本身的分配器不会更改存储在 map 中的对象所使用的分配。例如,如果您执行以下操作:

std::map<std::string, int, my_allocator<std::pair<const std::string, int> > m;

映射本身将使用指定的分配器分配内存,但是当映射中的 std::string 分配内存时,它们仍将使用默认分配器(这将使用 newdelete。因此,如果您通常需要避免 newdelete,您必须确保不仅 map 本身使用正确的分配器,而且它存储的任何对象都使用正确的分配器(我知道这可能是显而易见的,但我忽略了它,所以也许值得一提)。

有了这个附带条件,继续代码:

#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

还有一点测试代码:

#include <map>
#include <vector>
#include <iostream>
#include <string>
#include <iterator>
#include "allocator.h"

// Technically this isn't allowed, but it's only demo code, so we'll live with it.
namespace std {
std::ostream &operator<<(std::ostream &os, std::pair<std::string, int> const &c) {
return os << c.first << ": " << c.second;
}
}

int main() {
std::map<std::string, int, std::less<std::string>,
JVC::allocator<std::pair<const std::string, int> > > stuff;

stuff["string 1"] = 1;
stuff["string 2"] = 2;
stuff["string 3"] = 3;

std::copy(stuff.begin(), stuff.end(),
std::ostream_iterator<std::pair<std::string, int> >(std::cout, "\n"));

return 0;
}

关于c++ - 基于 malloc/free 的 STL 分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11415082/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com