C++ 这个分配器如何起到调试的作用?

C++ 这个分配器如何起到调试的作用?,c++,stl,allocator,sgi,C++,Stl,Allocator,Sgi,当我阅读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 // ali

当我阅读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;
  }

};
模板
类debug_alloc{
私人:
枚举{u S_extra=8};//用于存储大小的空间大小。注意
//这个必须足够大才能保存下来
//对齐。
公众:
静态空*分配(大小)
{
char*uuu result=(char*)u Alloc::allocate(uuu n+(int)u S_uextra);
*(大小*)\uuuu结果=\uu n;
返回结果+(整数)\u额外;
}
静态无效解除分配(无效*\u p,大小\u t\n)
{
char*\uuuu real\u p=(char*)\uuuu p-(int)\u S\u extra;
断言(*(大小t*)\uuuu实值p==\uuu n);
_Alloc::解除分配(uuu real_p,uuu n+(int)_S_extra);
}
静态void*重新分配(void*\uuu p、size\u t\uu旧sz、size\u t\uu新sz)
{
char*\uuuu real\u p=(char*)\uuuu p-(int)\u S\u extra;
断言(*(大小t*)实际值p===旧值sz);
char*\uuuu结果=(char*)
_Alloc::重新分配(uuu real_p,uu old_sz+(int)_S_extra,
__新的_sz+(int)_S_额外);
*(大小*)\uuuuu结果=\uu新的\uu深;
返回结果+(整数)\u额外;
}
};
这是一个调试模板

我可以看到它确保分配的空间始终大于8字节,并且我还可以看到它使用
*(size\u t*)\u result=\u替换从u result地址开始的内容但是我真的很困惑这个的目的

为什么要分配空间,然后用u\n替换内容? 那么为什么要返回
\uuuu结果+(int)\u S\u额外值并定义
char*\uuuu real\u p=(char*)\uuuu p-(int)\u S\u extra?
请详细解释函数
void*allocate(size\t\u\n)
void deallocate(void*\u\p,size\u\u\n)
如何在内存上工作


链接到源代码:

此分配器在每个分配之前使用一个8字节的头来记录其大小。通常在实际分配旁边存储这样的元数据。尽管标头包含4字节的int,但8字节确保返回的指针与8字节对齐,这是较大类型的常见要求

正如您可以从代码中读取的那样,allocate请求n+8字节(调用结果分配p),将大小存储在开头并返回p+8


取消分配和重新分配是指针p+8,因此必须先减去才能返回实际分配。

有关
\u S_extra
@molbdnilo的注释中描述了目的。我的英语读得很好。我问这个问题的原因似乎很明显,我不明白它是如何处理对齐的。它似乎只是跟踪分配大小并确保释放的大小相同,我认为它所做的只是你没有问到的对齐。您询问了其用途,即存储分配的大小以便进行验证。在不知道自己到底不明白的情况下,很难回答它是如何工作的。