gpt4 book ai didi

c++ - 在自定义堆上设置内存

转载 作者:太空宇宙 更新时间:2023-11-04 13:51:25 24 4
gpt4 key购买 nike

是否可以从 HeapCreate() 获取堆句柄并将所有可用内存设置为特定值?

我已经尝试按区域枚举堆并以这种方式设置它,但我遇到了访问冲突。

我基本上想将堆中的内存设置为可用于调试的自定义值,然后再通过 HeapDestroy 最终将其销毁。

最佳答案

简短的回答是“不,你不能用特定的值填充堆”。

例如,您可以使用调试版本包装您的堆访问函数

// In some header file
#define HeapAlloc(a, b, c) MyHeapAlloc(a, b, c, __FILE__, __LINE__)
#define HeapFree(a, b, c) MyHeapFree(a, b, c, __FILE__, __LINE__)

...

// In a separate source file:

#ifdef HeapAlloc
#undef HeapAlloc
#undef HeapFree
#endif

struct extra
{
extra *next;
size_t size;
const char *file;
int line;
};

extra* head;

LPVOID MyHeapAlloc(HANDLE heap, DWORD flags, SIZE_T size, const char *file, int line)
{
LPVOID res = HeapAlloc(heap, flags, size + sizeof(extra));
if (!res)
{
cout << "Allocation failed, called from " << file << ":" << line << endl;
return 0;
}

extra *p = reinterpret_cast<extra*>(res);
res = reinterpret_cast<void*>(&p[1]);

p->next = head;
p->size = size;
p->file = file;
p->line = line;

memset(res, 0xAA, size);
return res;
}

BOOL MyHeapFree(HANDLE heap, DWORD flags, LPVOID mem, const char *file, int line)
{
extra *p = reinterpret_cast<extra*>(mem);
p = reinterpret_cast<void*>(&p[-1]);

extra *q = head;
extra *prev = 0;
while(q)
{
if (reinterpret_cast<void*>(&q[1]) == mem)
{
break;
}
prev = q;
q = next;
}
if (!q)
{
cout << "Attempt to free memory that wasn't allocated from " << file << ":" << line << endl;
return false;
}

/* Unlink q - if prev = NULL then it's the first one, so just move head */
if (prev)
{
prev->next = q->next;
}
else
{
head = q->next;
}

memset(mem, 0xBB, q->size);
return HeapFree(heap, flags, reinterpret_cast<void *>(q);
}

我刚刚输入了所有内容,因此可能会有一些小错别字,但希望它能向您展示一种处理内存分配的方法。对于某些情况,您可能必须将 extra 结构填充为 16 或 32 字节的倍数,以确保后续数据的对齐。当然,您可以随时转储 head 指向的链表,以查看分配的内容。

关于c++ - 在自定义堆上设置内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com