我想重写操作new
有这样的签名: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
| | _|
|__________|
现在我真正的问题是:这样做会导致未定义的行为?有些事情可能是一个问题:
- 这可能是不确定的
new
返回多个字节比请求 - 您可能会遇到对齐问题(但这些也许可以克服)
我不知道任何禁止'new char [10]'返回100兆内存的东西。当然,这样的东西不会很有用。但是,C++中没有任何东西禁止它,AFAIK。 –
传统上你通过在对象之前存储额外的数据*来做到这一点,因为在销毁时你没有给出大小。这是一种常见的技术。分配X个额外的字节,在第一个X字节中写入内容,然后将X字节返回到缓冲区。 – Yakk