正在自定义堆上设置内存
Setting memory on a custom heap
是否可以从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++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏
- 如何在 2d 矢量上进行内存设置
- 如何设置指针的内存地址
- C++从 Java 角度设置和映射内存管理
- 在一个步骤中设置结构成员变量的内存利用
- 使用PYBIND11,如何为Array_t对象设置基础内存的所有权
- 内存堆,动态设置阵列
- 在C++中设置节点的内存地址
- 由 strcpy 设置的解除分配字符 * 时内存泄漏?
- 内存有效的加权设置分配,具有中等大小的集合
- 在程序开始时设置的C 内存语义和全球
- 定义一个C宏并将内存地址设置为用C和C++编写的结构成员
- 带有内存比较的 STL 映射.如何在运行时设置比较块大小
- 动态创建对象并将其内存设置为 0
- 我已经将虚拟内存设置为20GB,但由于内存不足,代码仍然无法工作
- Boost managed_mapped_file:设置允许的最大内存使用率
- c++设置内存地址为value
- 在Visual Studio 2012中设置内存断点
- 正在自定义堆上设置内存