我已經給了一個面試問題來寫一個內存管理器(內存池)。我差不多完成了,但我在解除分配時遇到問題。尋求幫助也很好,就像我們提到幫助的來源一樣。所以,請幫我如何檢查指針在C++中是否有效?
int main(void)
{
using namespace PoolOfMemory;
initializePoolOfMemory(); // Initialize a char array as the memory pool
long* int_pointer;
int_pointer = (long *) allocate(sizeof(long)); //allocate is defined in PoolOfMemory and it returns void*.
int_pointer = 0xDEADBEEF;
deallocate(int_pointer);
}
現在我的問題是,當「取消分配」試圖int_pointer解除分配,它拋出一個訪問衝突錯誤,顯然是因爲我想訪問0xDEADBEEF。以下是我的簡單釋放功能:
void deallocate(void* p)
{
Header* start = (Header*)((char*)p-sizeof(Header));
start->free=true; //This is where I get access violation.;
}
我該如何避免這種情況?根據我在網上閱讀的內容,我假設檢查p是否在我的數組中,是行不通的。
顯而易見的答案是不操縱指針直接指向的內存位置的值...我無法想象爲什麼你會分配內存,然後指向這種方式的任意位置。除非您使用第三方庫進行內存管理,這是專門設計用於防止您釋放不在其分配的區域內的指針(這會增加相當多的開銷),您必須遵循良好的指針規則並編寫乾淨的代碼。 –
請參閱http://stackoverflow.com/questions/496034/most-efficient-replacement-for-isbadreadptr和http://stackoverflow.com/questions/17202570/c-is-it-possible-to-determine-whether-一個指針指向一個有效的對象 –
我明白你的觀點。但主要文件給了我,顯然他們希望代碼來處理這種情況。 – Sasan