我已经给了一个面试问题来写一个内存管理器(内存池)。我差不多完成了,但我在解除分配时遇到问题。寻求帮助也很好,就像我们提到帮助的来源一样。所以,请帮我如何检查指针在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