关于如何在不使用new或malloc的情况下分配内存的question,假设我有一个结构链表
struct stack {
string info;
stack next*;
};
提供的答案说使用全局字节数组。如何通过分配到全局字节数组来实现链表?
答案 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 delete
和Stack
重载为
从这个池分配。 (但当然,那是使用new
和
delete
。是什么让这个问题变得如此愚蠢;通用的
解决方案,它不依赖于指针的存在
对象,需要某种形式的new
来初始化对象。)
你不能做的一件事就是声明一个全局字节数组,
因为不能保证它会正确对齐(我已经
使用了不止一个编译器。如果你想要一个字节
数组,它必须是某种union
以保证足够
对准。 (在我知道的所有机器上,添加double
union
就足够了。但它也不能保证。)如果你是
使用字节数组,你仍然需要某种形式的new
来构建你的
对象;要么重载operator new
和operator delete
你的类,使用字节数组分配(然后分配
正常使用new
和delete
的类的实例,或者您使用
某种形式的安置新的。