我想覆盖运算符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
| | _|
|__________|
可能未定义返回的字节多于请求的答案 0 :(得分:9)
这种事情很常见。但是,您通常会在开始时而不是在结尾处存储额外数据(注意平台的最大对齐,即您可能需要填充)。语言中没有任何内容禁止你提出的建议。
答案 1 :(得分:4)
来自[basic.stc.dynamic.allocation]:
分配功能尝试分配所请求的存储量。如果成功,它将返回存储块的起始地址,其长度以字节为单位至少与请求的大小一样大。
重点补充。所以,是的,该标准允许有效存储区域拥有比严格要求更多的空间。