在自定义内存管理器中使用向量

时间:2011-12-23 21:52:54

标签: c++ memory memory-management

我正在用c ++编写一个内存管理器。目的是使用malloc在开始时分配一定量的内存,然后重载new和delete以便它使用该内存。我几乎让它工作我唯一的问题是我如何跟踪记忆中的位置。

我创建了一个结构矢量,其中包含大小,位置等信息,以及它是否空闲。

问题是当我调用push_back时它会尝试使用我重载的新函数。这是它失败的地方,因为在它推回第一个信息结构之前它不能使用我的重载新。

有谁知道我如何解决这个或更好的方法来跟踪记忆?

3 个答案:

答案 0 :(得分:2)

不要超载全局operator new

最简单的(警告;主观 - > )最佳解决方案是定义您自己的分配器,您将在处理免费分配时使用商店(又名堆)。所有STL容器都支持将AllocatorType作为模板参数传递。

重载全局operator new / operator delete似乎是一个简洁的解决方案,但我几乎可以向您保证,随着开发的进行,它会给您带来麻烦。

在这个自定义分配器中,你可以跟踪到底在哪里,但是让内部std::vector(或者你想要使用的任何东西,std::map似乎更适合我)将使用默认operator new / operator delete


如何创建自己的分配器?

以下链接将引导您找到一份包含此事的相关信息的好文档:


在尝试为分配内存的分配器分配内存时,在需要/需要时使用自定义分配器会使遇到任何鸡和蛋问题,但是分配器必须已分配内存以使用分配器方法..什么将为分配器但分配器分配内存?那么我们需要为该分配器分配内存,并且分配器必须拥有它自己的分配器,尽管该分配器需要内存,由另一个分配器提供?

也许我应该让自己成为一只狗,他们不会产卵 - 对吗?

答案 1 :(得分:1)

只在这个类中创建一个类并重载new。你的矢量不会有问题。您可以使用自己的新::new A和普通新new A

class C
{
public:
void* operator new( size_t n ) ;
// ...
} ; 

否则,您可以使用自己的运算符函数,而不是重载operator new:

分配器的基本概念:

int *i = myGetMem(i); // and myGetMem() allocates sizeof(*i) bytes of memory.

所以你不会有使用矢量的问题。


实际上,一个真正的内存分配器会将你放在内存中的信息保存在自己分配的内存中:

你可以采用getmem / freemem的算法来适应你的情况。它可以是有帮助的。

e.g。 :我想分配10个字节,@ 1024的内存包含有关内存分配的信息,分配器在1024之后返回地址,可能是@ 1030(取决于存储的信息)作为分配内存的开始。因此,用户获得地址1030并且他在1030和103A之间有记忆。

调用deallocator时,开头的信息用于正确释放内存并将其放回可用内存列表中。

(availvle内存列表存储在流行的算法中,在一系列链接的自由存储器列表中按大小组织算法以避免和最小化碎片)

这可以解决您对矢量的需求。

答案 2 :(得分:0)

您可以使用任何自定义分配器创建矢量。

以下列方式声明:

std::vector<YourStruct, YourOwnAllocator> memory_allocations;

YourOwnAllocator将成为一个类,它将分配向量绕过重载运算符所需的数据。 需要提供列出的所有方法和typedef here