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

Dar*_*bik 2 c++ new-operator undefined-behavior language-lawyer

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

void* operator new(size_t bytes, MemoryManager* man);
Run Code Online (Sandbox Code Playgroud)

这堂课MemoryManager看起来像这样:

struct MemoryManager
{
  virtual void* Allocate(size_t bytes) = 0;
  virtual void Deallocate(void* ptr) = 0;
};
Run Code Online (Sandbox Code Playgroud)

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

 __________
|          |   _
|__________|    |
|          |    |
|__________|    |
|          |    | <---- Bytes requested for object
|__________|    |
|          |    |
|__________|    |
|          |   _|
|__________|   
|          |   _ 
|__________|    | <---- Pointer to MemoryManager
|          |   _|
|__________|   
Run Code Online (Sandbox Code Playgroud)

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

  • new返回的字节数多于请求数,可能未定义
  • 您可能遇到对齐问题(但可能会克服这些问题)

Joh*_*nck 9

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