2012-02-04 84 views
1

我正在做家庭作業,我遇到了這些問題。 我在調用allocate()時得到EXC_BAD_ACCESS;爲什麼我會用這些C++函數獲取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; 
} 
+2

爲什麼你覺得你需要用malloc和memcpy等來完成所有這些低級C風格的內存管理?正如你現在看到的那樣,這很容易出錯。 – 2012-02-04 20:19:08

+2

像'memcpy(&free,free,...)'這樣的行和'expandPool()'中應該實現的循環是什麼? 'pool = tmp中的刪除;刪除[] tmp;'是絕對錯誤的。 – 2012-02-04 20:31:45

+0

@PaulR可能是分配的要求。我記得我在Uni時有那些瘋狂的限制。 – Krizz 2012-02-04 20:36:16

回答

2

如果你的谷歌EXC_BAD_ACCESS,你會發現這是因爲你正在訪問分配內存塊以外的內存。這可能有幾個原因。

所以,讓我們開始在故障點 - 在memcpy:你寫的自由指針(&free)的自由(free)的內容,並複製sizeof(char *)字節。假設免費被宣佈爲char *free;那麼沒關係,所以它必須是你正在寫的free的內容。

在風格上,使用memcpy這樣 - 複製單個指針值 - 令人困惑。你是更好的東西去像:

free = *(char **)free; 

這相當於你:

memcpy(&free,free,sizeof(char*)); 

sizeof(char*)的價值體系之間變化 - 4在32位和8在64位 - 所以分配的空間量必須至少很大。

好了,讓我們看看expandPool方法,看看有什麼自由設置爲:

tmp2 = new char; 

在這裏,你與sizeof(char)這是1分配的內存塊。這需要至少爲:

tmp2 = new char[sizeof(char *)]; 

注意:調用您的變量free將覆蓋free功能,所以你需要通過編寫::free明確地訪問該功能。

我會首先繪製一個圖,說明你希望池的內存佈局是什麼,以及它如何在空時查看/更改(a),(b)分配空閒的塊和c)在需要擴展池時分配塊。使用不同的變量(pooltmp,tmp2free)註釋圖表。這會讓你知道你需要做什麼以及代碼應該是什麼樣子。

對數據結構和算法有很好的理解(通過創建圖表)可以幫助您獲得正確的代碼。

1

有在代碼中的幾個問題。一個脫穎而出對我來說是這樣的部分:

pool = tmp; 
delete [] tmp; 

對我來說,這使得pool點刪除記憶。稍後在代碼中使用pool會導致未定義的行爲,這是語言無法解釋的。代碼中其他地方的失敗只是可以預料的。

+0

我現在明白了爲什麼我不應該使用'delete [] tmp'。我從我的代碼中刪除了這些,但仍然收到EXC_BAD_ACCESS錯誤。 – justspamjustin 2012-02-04 20:39:03

+0

如果你使用'new []',你應該*使用'delete []',但是刪除一個對象會使所有**指針失效**。 – 2012-02-04 20:41:40

相關問題