Я хочу, чтобы переопределить оператор 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