私は単純なメモリアリーナアロケータを作成しており、例外安全性に関する小さな問題に直面しています。状況は、アロケータを呼び出すオブジェクトを割り当てるときです。メモリプールの目的は、一度に多数のオブジェクトを割り当て、プールが破棄されたときにそれらをすべて削除することです。メモリアリーナでの例外安全性
{
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