我正在做作业,并且遇到了这些问题。
调用allocate()时得到EXC_BAD_ACCESS;
void* Pool::allocate() {
if( free == NULL) {
this->expandPool();
}
void* tmp = free;
void* mem = malloc(elemSize);
memcpy(&free,free,sizeof(char*)); //exec bad access right here
memcpy(tmp,mem,sizeof(elemSize));
return tmp;
}
这是我的expandPool方法:
void Pool::expandPool() {
poolSize++;
// Is this the first time?
if(poolSize <= 1)
pool = new char*[poolSize];
else {
char** tmp = new char*[poolSize];
memcpy(tmp,pool,sizeof(pool));
delete [] pool;
pool = tmp;
delete [] tmp;
}
char* tmp = NULL;
char* tmp2;
for(int i = 0; i < blockSize; i++) {
tmp2 = new char;
memcpy(tmp2,&tmp,sizeof(char*));
tmp = tmp2;
}
pool[poolSize - 1] = tmp;
free = tmp;
}
最佳答案
如果您google EXC_BAD_ACCESS
,您会发现这是因为您正在访问分配的内存块之外的内存。这可能有几个原因。
因此,让我们从失败点开始-memcpy
:您正在将空闲(&free
)的内容写入空闲指针(free
),并正在复制sizeof(char *)
字节。假设free被声明为char *free;
,那没关系,因此它必须是您正在编写的free
的内容。
从风格上讲,像这样使用memcpy
(复制单个指针值)是令人困惑的。您最好选择以下类似的东西:
free = *(char **)free;
这等效于您:
memcpy(&free,free,sizeof(char*));
sizeof(char*)
的值在系统之间有所不同-32位的4
和64位的8
-因此分配的空间量必须至少那么大。好的,让我们看一下expandPool方法,看看免费设置为什么:
tmp2 = new char;
在这里,您正在使用
sizeof(char)
的1
分配一块内存。至少需要:tmp2 = new char[sizeof(char *)];
注意:调用变量
free
将覆盖free
函数,因此您需要通过编写::free
显式访问该函数。我首先画一个图,说明您希望池的内存布局是什么,以及它的外观/更改(a)为空时,(b)分配空闲块时,(c)分配时需要扩展池时的一个大块。用不同的变量(
pool
,tmp
,tmp2
和free
)对图进行注释。这将使您对需要执行的操作以及代码的外观有所了解。充分了解数据结构和算法(通过创建图表)将帮助您正确编写代码。
关于c++ - 为什么我使用这些c++函数得到EXC_BAD_ACCESS?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9144166/