我在寫一個簡單的內存競技場分配器,並面臨一個異常安全的小問題。情況是當你分配一個本身調用分配器的對象時。內存池的目標是一次分配一堆對象,然後在池被銷燬時全部刪除它們。內存競技場的異常安全
{
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 2011-12-21 15:19:47
目前還不清楚你如何泄漏記憶,何時在競技場被釋放時它將被釋放。 – zvrba 2011-12-21 15:27:11
@zvrba:它被分配,但不可用,因爲對象從來沒有被構造過,並且指針從不返回,所以內存泄漏直到該區域被銷燬。 – Puppy 2011-12-21 15:27:49