这个分配器是如何起到调试作用的呢?

How does this allocator play the role of debugging?

当我阅读 SGI/STL 的源代码时,我注意到

template <class _Alloc>
class debug_alloc {

private:

  enum {_S_extra = 8};  // Size of space used to store size.  Note
                        // that this must be large enough to preserve
                        // alignment.

public:

  static void* allocate(size_t __n)
  {
    char* __result = (char*)_Alloc::allocate(__n + (int) _S_extra);
    *(size_t*)__result = __n;
    return __result + (int) _S_extra;
  }

  static void deallocate(void* __p, size_t __n)
  {
    char* __real_p = (char*)__p - (int) _S_extra;
    assert(*(size_t*)__real_p == __n);
    _Alloc::deallocate(__real_p, __n + (int) _S_extra);
  }

  static void* reallocate(void* __p, size_t __old_sz, size_t __new_sz)
  {
    char* __real_p = (char*)__p - (int) _S_extra;
    assert(*(size_t*)__real_p == __old_sz);
    char* __result = (char*)
      _Alloc::reallocate(__real_p, __old_sz + (int) _S_extra,
                                   __new_sz + (int) _S_extra);
    *(size_t*)__result = __new_sz;
    return __result + (int) _S_extra;
  }

};

这是一个调试模板。

我可以看到它确保分配的 space 总是大于 8 个字节,我还可以看到它用 [=11 替换了从 __result 地址开始的内容=] 但我真的很困惑这样做的目的。

为什么分配space然后用__n替换内容? 为什么然后 return __result + (int) _S_extra; 并定义 char* __real_p = (char*)__p - (int) _S_extra;? 请详细解释函数 void* allocate(size_t __n)void deallocate(void* __p, size_t __n) 如何处理内存。

Link转源码:https://github.com/karottc/sgi-stl/blob/master/concept_checks.h

这个分配器在每次分配前使用一个 8 字节 header 来记录它的大小。在实际分配旁边存储这样的元数据是很常见的。即使 header 包含一个 4 字节的 int,8 字节确保返回的指针与 8 字节对齐,这是对较大类型的常见要求..

正如您从代码中读到的那样,分配请求 n+8 个字节(调用结果分配 p),在开头存储大小和 returns p+8。

Deallocate 和 reallocate 都给定了指针 p+8,所以必须先减去才能回到真正的分配。