Visual c++ 竞技场分配器分配方法&;违规写作问题
基本上,我试图创建一个Arena分配器,而不使用结构、类或新操作符来手动管理内存。我有一个定义的大小、一个字符池、一个分配方法和一个freeMemory显示方法 请注意,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
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);