Operator new 返回比请求更多的内存

Operator new returning more memory than asked to

我想覆盖运算符 new 以获得此签名:

void* operator new(size_t bytes, MemoryManager* man);

class MemoryManager 看起来像这样:

struct MemoryManager
{
  virtual void* Allocate(size_t bytes) = 0;
  virtual void Deallocate(void* ptr) = 0;
};

现在我想要做的是让重载的 new 函数分配比要求的更多的内存。然后在最后几个字节中它将存储一个指向 MemoryManager 对象的指针,以便它知道在我的自定义 delete 运算符中使用什么函数。所以它看起来像这样分配:

 __________
|          |   _
|__________|    |
|          |    |
|__________|    |
|          |    | <---- Bytes requested for object
|__________|    |
|          |    |
|__________|    |
|          |   _|
|__________|   
|          |   _ 
|__________|    | <---- Pointer to MemoryManager
|          |   _|
|__________|   

现在我真正的问题是:这样做会导致未定义的行为吗?有些事情可能是个问题:

这种事情比较常见。但是,您通常会在开始而不是结束时存储额外的数据(注意平台的最大对齐方式,即您可能需要填充)。语言中没有任何内容禁止您提出的建议。

来自[basic.stc.dynamic.allocation]:

The allocation function attempts to allocate the requested amount of storage. If it is successful, it shall return the address of the start of a block of storage whose length in bytes shall be at least as large as the requested size.

添加了重点。所以是的,该标准允许一个有效的存储区域具有比严格要求的更多 space。