我正在做作业,并且遇到了这些问题。
调用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)分配时需要扩展池时的一个大块。用不同的变量(pooltmptmp2free)对图进行注释。这将使您对需要执行的操作以及代码的外观有所了解。

充分了解数据结构和算法(通过创建图表)将帮助您正确编写代码。

关于c++ - 为什么我使用这些c++函数得到EXC_BAD_ACCESS?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9144166/

10-11 22:38
查看更多