Visual c++ 竞技场分配器分配方法&;违规写作问题

Visual c++ 竞技场分配器分配方法&;违规写作问题,visual-c++,Visual C++,基本上,我试图创建一个Arena分配器,而不使用结构、类或新操作符来手动管理内存。我有一个定义的大小、一个字符池、一个分配方法和一个freeMemory显示方法 请注意,pool[0]是我的索引,它将跟踪上次填充内存的位置 const int size = 50000; char pool[size]; void start() { pool[0] = 1; } int freeMemory(void) { int freemem = 0; for(int i = 0

基本上,我试图创建一个Arena分配器,而不使用结构、类或新操作符来手动管理内存。我有一个定义的大小、一个字符池、一个分配方法和一个freeMemory显示方法

请注意,
pool[0]
是我的索引,它将跟踪上次填充内存的位置

const int size = 50000;
char pool[size];

void start() {
    pool[0] = 1;
}

int freeMemory(void) {
    int freemem = 0;
    for(int i = 0; i < size; i++) {
        if(pool[i] == NULL) {
            freemem++;
        }
    } 
    return freemem;
}

 void* allocate(int aSize)
 {

if(freeMemory() == 0)
  {
        out();
  }

else
{
    char* p = NULL;
    int pos = pool[0];
    pool[pos] = (char) a;
    p = &pool[pos];
    pool[0] += a;
    return((void*) &pool[pos]);
}
}
const int size=50000;
字符池[大小];
void start(){
池[0]=1;
}
int自由内存(void){
int freemem=0;
对于(int i=0;i
在main.cpp中:

start();
long* test1 = (long *) allocate(sizeof(long));
cout << freeMemory() << endl; //Returns 49999
*test1 = 0x8BADF00D; //Breaks here
cout << freeMemory() << endl; 
start();
long*test1=(long*)分配(sizeof(long));

cout您的代码可能存在问题

char* pointer;
for(int i = 0; i < size; i++)
{
    *pointer = pool[i];
池[i]应复制到哪里? 例如,假设我们像这样对指针进行了声明

char* pointer = NULL;
现在很清楚

*pointer = pool[i];
这是错误的。
g++
(我注意到)初始化指向NULL的指针。所以你的代码会出错。VC++可能会工作,因为它没有空初始化
指针
。但是您正在写入的内存位置不是您的。

下面的代码有许多错误

char* pointer;
for(int i = 0; i < size; i++)
{
    *pointer = pool[i];
    if(pointer != NULL)
    {
        pointer = (char*) a;
        return((void*) i); //return the pointer
    }
 }
你可能想复制一个指针

    pointer = &pool[i];
尽管您确实想从
数组复制指针,但这将始终为真。该数组中没有任何元素位于地址
NULL

    if(pointer != NULL)
现在,此代码将指针更改为指向更多无效地址。当
a
sizeof(long)
时,该大小将被重新解释为内存地址。内存地址最有可能是0x00000004

        pointer = (char*) a;
在您的情况下,这将返回地址
0x00000000
。因为
i
0

        return((void*) i); //return the pointer

分配存在一些问题:

char* pointer = NULL;
int pos = pool[0];
pool[0]
是一个
char
。它不够大,无法将索引存储到数组的所有成员

pool[pos] = (char) a;
我不知道你在这里储存什么,或者为什么。您似乎正在分配的空间中存储分配的大小

pointer = &pool[pos + a];
我认为您正在构造一个指向分配部分之后的内存的指针。是这样吗

pool[0] += a;
在这里,您将增加偏移量,显示分配了多少池,除了单个
char
不够大,不能超过一小部分的分配

return((void*) &pointer);
现在返回指针变量的地址。这将是堆栈上的地址,使用起来不安全。即使您只是输入
指针的内容,而不是它的地址,我认为它也会指向您刚才在池中分配的区域之后

自由内存也有问题。它将池的内容(
char
elements)与NULL进行比较。这表明您认为它包含指针,但它们只是
char
s。不清楚为什么池中未分配的部分将为0。您是否允许在池中取消分配

也许您可以解释一下您希望分配器如何工作?很明显,你认为它应该做什么和它实际做什么之间存在差距,但是你不清楚它应该做什么,所以很难给出建议。如何分配阵列中的空间?你允许解除分配吗?什么信息应该在哪里编码



我刚刚意识到allocate使用了未定义的变量
a
。这应该与参数aSize
相同吗?这就是我在这里的假设。

我看不出您是如何编译
*test1=0xTESTMEEE
的。这真的是你的密码吗?是的。我的意思是TESTMEEE只是一个占位符。我尝试过其他方法,如0x8BADF00D和FOO等。
pool[0]
是一个字符,分配少量字节后会溢出。为什么不声明一个
size\u t
来保存
pos
作为字段?什么是
a
?你是对的,当我想说pointer=&pool[I]时,我混淆了*pointer=pool[I];if检查是我一直在做的一次编辑错误留下的。够傻的了,我忘了把它取下来。然而,在对代码进行了一点修改以包含索引,甚至没有考虑到我以前遇到的指针复杂性之后,我仍然在0x00004上遇到写入错误。我已经更新了OP以显示我所做的新更改。@user2229804恐怕这也不是您真正的代码<代码>MM_池
未定义。我建议你复制并粘贴一个精确完整的程序作为问题。如果你展示的不是你遇到麻烦的程序,人们将很难帮助你修复你的程序。复制错误。我试图从头开始重写代码,并将其命名为更具建设性的代码,但没有帮助,因为我遇到了同样的问题。这就是程序,我还没有做释放方法。@user2229804现在发布的代码没有编译。我很抱歉,但是我已经没有办法告诉你这不是你真正的代码。我无法修复你的绝密、不可见的代码。你是对的,我肯定有初始化问题。但即使在删除它或试图修复它之后,它仍然会给我一个写错误。“g++(我注意到)初始化指向NULL的指针”这通常是不正确的。这是一个巧合。取消分配将得到支持,我只是想先取消分配。我试图指出的指针是内存池分配后的点。因此,如果我为0x8BADF00D分配,它将返回下一个池空闲的指针。至于池[0]-您建议如何保存我的非全局变量索引?我的目标是尽量把一切都控制住
pool[0] += a;
return((void*) &pointer);