C ++使用数组分配内存

时间:2011-06-13 05:16:42

标签: c++ memory-management

关于如何在不使用new或malloc的情况下分配内存的question,假设我有一个结构链表

struct stack {
 string info;
 stack next*;

};

提供的答案说使用全局字节数组。如何通过分配到全局字节数组来实现链表?

3 个答案:

答案 0 :(得分:2)

使用索引到数组中而不是指针。 (实际上,指针只是代表所有虚拟内存的字节数组的索引)。您必须跟踪使用哪些索引(或索引范围)。

这称为基于池的分配器。

答案 1 :(得分:2)

一种方法是在数据段中声明一个内存池,并拥有自己的内存分配函数。

char myMemoryPool[10000000]; // global variable (can be enclosed in namespace)

你必须编写自己的内存管理器:

void* MyMemoryAlloc (size_t SIZE)
{
 //... use SIZE
}

用法:

A* p = (A*)MyMemoryAlloc(sizeof(A) * 3);

或者更准确地说,

template<typename T>
T* MyMemoryAlloc (unsigned int UNITS)
{
//... use (sizeof(A) * UNITS)
}

用法:

A *p = MyMemoryAlloc<A>(3);

答案 2 :(得分:0)

这个问题应该是什么意思并不太清楚。你可以 只是声明一个stack的大块,并使用它们,也许使用一点 某种矢量来跟踪哪些是免费的,或者是 只需将自由元素保存在自己的列表中(因为你有一个 类型中的指针)。更通用的解决方案(不依赖于 指针)将涉及一个联盟:

union StackPoolElement
{
    StackPoolElement* next;
    double dummyForAlignment;
    unsigned char data[sizeof(Stack)];
};
static StackPoolElement pool[10000];

然后,您可以将operator new中的operator deleteStack重载为 从这个池分配。 (但当然,那是使用newdelete。是什么让这个问题变得如此愚蠢;通用的 解决方案,它不依赖于指针的存在 对象,需要某种形式的new来初始化对象。)

你不能做的一件事就是声明一个全局字节数组, 因为不能保证它会正确对齐(我已经 使用了不止一个编译器。如果你想要一个字节 数组,它必须是某种union以保证足够 对准。 (在我知道的所有机器上,添加double union就足够了。但它也不能保证。)如果你是 使用字节数组,你仍然需要某种形式的new来构建你的 对象;要么重载operator newoperator delete 你的类,使用字节数组分配(然后分配 正常使用newdelete的类的实例,或者您使用 某种形式的安置新的。