【发布时间】:2016-05-25 02:05:18
【问题描述】:
我收到了一个面试问题,要写一个内存管理器(内存池)。我快完成了,但我在解除分配方面遇到了问题。寻求帮助也很好,就像我们提到帮助的来源一样。所以请帮帮我
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);
}
现在我的问题是,当“deallocate”尝试释放 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 是否在我的数组中是行不通的。
【问题讨论】:
-
显而易见的答案是不要操纵指针直接指向的内存位置的值......我无法想象你为什么要分配内存然后以这种方式指向某个任意位置。除非您使用第三方库进行内存管理,该库专门用于防止您释放不在它分配的区域中的指针(这会增加相当多的开销),否则您必须简单地遵循良好的指针规则并编写干净的代码.
-
我明白你的意思。但是主文件给了我,显然他们希望代码能够处理这种情况。
标签: c++ memory-management access-violation void-pointers