Я пишу простой распределитель арены памяти и сталкиваюсь с небольшой проблемой с безопасностью исключений. Ситуация заключается в том, что вы выделяете объект, который сам вызывает распределитель. Задача пула памяти состоит в том, чтобы выделить кучу объектов за один раз, а затем удалить их все, когда пул будет уничтожен.Исключение безопасности на арене памяти
{
MemoryArena m;
std::string* ptr = m.Allocate<std::string>();
// use ptr whatever
// Cleaned up when pool is destroyed
}
Но это довольно неприятно, когда оно используется несколько раз. Если внутреннее выделение очищено, то оно может быть использовано впоследствии - не плохое предположение, так как определение пула никогда не удаляет объекты до тех пор, пока не закончится его жизнь. рассмотреть следующие вопросы:
struct X {
X(MemoryArena* ptr, std::string*& ref) {
ref = ptr->Allocate<std::string>();
throw std::runtime_error("hai");
}
};
MemoryArena m;
std::string* ptr;
m.Allocate<X>(&m, ptr);
// ptr is invalid- even though it came from the arena
// which hasn't yet been destroyed
Но если внутреннее распределение не очистки, внешнее распределение также не может быть очищены, потому что арена памяти распределяет их линейно, как на аппаратный стеке, поэтому я утечка памяти , Поэтому либо я нарушаю свою семантику, уничтожая объект раньше, либо я утечка памяти.
Любые предложения по устранению этой проблемы?
Что такое 'MemoryArena'? Как мы можем говорить что-либо, не зная об этом? – Nawaz
Непонятно, как вы просачиваете память, когда она освободится, когда арена освободится. – zvrba
@zvrba: выделено, но непригодно, потому что объект никогда не строился, и указатель не возвращался, поэтому память просачивается до тех пор, пока область не будет уничтожена. – Puppy