操作员新回复的内存比要求的多

时间:2016-07-30 18:34:30

标签: c++ language-lawyer new-operator undefined-behavior

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

new

班级void* operator new(size_t bytes, MemoryManager* man); 看起来像这样:

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 | | _| |__________| 可能未定义返回的字节多于请求的
  • 您可能遇到对齐问题(但可能会克服这些问题)

2 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

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

  

分配功能尝试分配所请求的存储量。如果成功,它将返回存储块的起始地址,其长度以字节为单位至少与请求的大小一样大。

重点补充。所以,是的,该标准允许有效存储区域拥有比严格要求更多的空间。