Я внедрил пользовательский распределитель (который будет использоваться контейнерами STL в моей утилите для отладки памяти без использования моего переопределенного нового оператора). Внутри отладчика памяти я использую экземпляр того же класса распределителя для выделения объектов, которые мне нужны, чтобы отслеживать «нормальные» распределения памяти. Все работает нормально, но я не уверен, правильно ли я использую интерфейс распределителя. Вот методы полезности, поскольку они в настоящее время стоят (правильные параметры инициализации для входа будет добавлено в ближайшее время):Каков правильный способ создания объекта с помощью распределителя?
iidebug::CMemoryDebugger::CEntry* iidebug::CMemoryDebugger::NewEntry()
{
CEntry* pEntry = m_entryAllocator.allocate(1);
if (0 != pEntry)
{
new(pEntry) CEntry(0, 0, __FILE__, 0, 0, 0);
}
return pEntry;
}
void iidebug::CMemoryDebugger::DeleteEntry(iidebug::CMemoryDebugger::CEntry* pEntry)
{
if (0 != pEntry)
{
destruct(pEntry);
m_entryAllocator.deallocate(pEntry, 1);
}
}
Это только кажется, очень грязный, но я не могу понять, как я могу улучшить его.
Это намного опрятный вариант, спасибо стек :) – FlintZA
Что-то, что мне нравится делать, также переопределяет новый оператор по умолчанию, так что все распределения иметь указатель функции в начале выделения (нужно добавить дополнительные 4 байта при работе в 32-битном приложении x86), что указывает на функцию dealloc съел память. затем, когда вы удаляете объект (все объекты могут быть удалены с помощью операторов удаления по умолчанию с этим), вы просто вызываете этот указатель функции. –
Интересная идея, это для отладки памяти? Если он находится в новом по умолчанию, и тот же самый указатель функции всегда передается, почему бы просто не вызвать функцию явно внутри переопределенного удаления вместо того, чтобы принимать дополнительные 4 байта на каждый указатель? – FlintZA