我正在读一本名为"Code Complete"的书.在书中,有一个关于"狗标记字段"的解释.
使用dog-tag字段检查内存是否损坏."标记字段"或"狗标记"是仅为了进行错误检查而添加到结构中的字段.
您是否见过软件或许多用户使用的某些软件中"dog-tag"字段的实际用法?
麦康奈尔所说的“狗标签”只是将一个字段放入数据结构中,并使用可识别的值对其进行初始化。当结构被释放时,标签字段应该被“擦除”。
struct foo {
unsigned int tag;
int bar;
char baz[20];
char* qux;
};
enum {
tag_freed = 0xcfcfcfcf,
tag_foo = 0x206f6f66, // "foo " in little-endian
};
struct foo* foo_alloc(void)
{
struct foo template = {tag_foo};
struct foo* p = malloc(sizeof struct foo);
if (p) {
*p = template;
}
return p;
}
int foo_validate(struct foo* p)
{
return p && (p->tag == tag_foo);
}
void foo_free(struct foo* p)
{
if (p) {
if (!foo_validate(p)) error_handler(/* ... */);
p->tag = tag_freed;
free(p);
}
}
Run Code Online (Sandbox Code Playgroud)
这类标签有几个优点:
Windows 内核为驱动程序的标记内存分配提供内置支持(在这种情况下,标记由内核池管理器管理,并且位于驱动程序源代码中定义的结构外部):
| 归档时间: |
|
| 查看次数: |
420 次 |
| 最近记录: |