2011-12-21 10 views
1

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

{ 
    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 

しかし、内側の割り当ては、メモリアリーナが直線的にハードウェアスタック上のようにそれらを確保するので、外側の割り当てはまた、クリーンアップすることができないので、私は、メモリリークが発生し、クリーンアップされていない場合。だから私は、オブジェクトを早期に破壊することによって私のセマンティクスに違反するか、あるいは記憶を漏らすかのどちらかです。

この問題を解決する方法の提案はありますか?

+2

「MemoryArena」とは何ですか?それを知らずに何が言えるのですか? – Nawaz

+0

アリーナが解放されたときに解放されるときに、メモリをリークする方法は不明です。 – zvrba

+0

@zvrba:オブジェクトが構築されず、ポインタが返されなかったため、領域は破棄されるまでメモリがリークされるため、割り当てられましたが使用できません。 – Puppy

答えて

2

これはほんの例のコードですが、Xのコンストラクタがスローされたときにptrが有効であると想定する必要はありません。それは、refが割り当てられる前にスローされてもよい。

できるだけ内側のオブジェクトをクリーンアップする(つまり、アリーナの前面が現在内側のオブジェクトの端にある場合)。確かに、アリーナからの割り当ては無効になります。これは正常ではありませんが、それは決して現実世界に決して分配してはいけない割り当てです。

おそらく、これを「ソフト」割り当てという概念で明示的にすることができます。永遠に生きることは保証されていません。なぜなら、まだ「ソフト」なので、それはアリーナに解放されるからです。そして、Xのコンストラクタのようなものだろう:

SoftPtr<std::string> tmp(ptr->SoftAllocate<std::string>()); 
stuff_that_might_throw(); 
ref = tmp.release(); 

が最初releaseを呼び出さずにせずにSoftPtrのデストラクタを実行するオブジェクトへの参照が露出されていないことを意味します。それはのようなものないMemoryArenaの関数を呼び出す:もしそうなら、これはアリーナ

    • から最新の割り当てであるかどうかをオブジェクト
    • チェック自爆

      • を、アリーナの現在のサイズを引きます位置ポインタ
      • ない場合、(メモリがリークされる)
      • 他に何もしません

    逆の順序であれば、任意の数のallocを「バックアウト」することができます。

  • +0

    おすすめのおすすめ私はおそらくポインタが無効になることを許可します。 – Puppy

    0

    メモリプールの非常にセマンティクスがあり、あなたが質問で述べたように、個々のオブジェクトではなくプール全体を解放することができます。しかし、あなたはそれを正確にしたい。

    次の割り当てアドレスを取得して設定するには、アロケータにbrk-like functionsを設定します。これにより、必要なものを構築するために使用できる低レベルのメカニズムが提供されます。

    関連する問題