3

ヒープ上で実行されるオブジェクトが、処理が完了したときに常に割り当て解除されるようにする方法を探しています。

スタックに割り当てられている場合、RAIIを使用して確実に処理できることを知っています-残念ながら、問題のオブジェクトはAPI関数を呼び出すことによって実際に作成されるため、これは(少なくとも直接的には)機能しません、ヒープ上に作成するオブジェクトへのポインターを返します。

したがって、概念的には、私がやりたいことは次のようなものです。

TheApi::ApiObject* p_myObj = TheApi::createAnApiObj();
try
{
    doStuffWithMyObjThatMayError(p_myObj);
}
finally
{
    delete p_myObj;
}

私が考えることができる唯一のことは、ある種のダミーのクリーンアップ クラスを作成し、スタック上にそのインスタンスを作成することです。

class MegaMaid
{
private:
    TheApi::ApiObject* toFree;
public:
    MegaMaid(TheApi::ApiObject* toFree)
    {
        this->toFree = toFree;
    }

    ~MegaMaid()
    {
        delete toFree;
    }
};

void doStuff()
{
    TheApi::ApiObject* p_myObj = TheApi::createAnApiObj();
    TheApi::ApiObject* p_myObj;
    MegaMaid cleaner(p_myObj);
    doStuffWithMyObjThatMayError(p_myObj);
}

これを達成するためのより良い方法はありますか?それとも、これは受け入れられた解決策ですか?

4

2 に答える 2

6

その「ダミー クラス」は「スマート ポインター」として知られています。std::auto_ptrまたはをチェックアウトする必要がありboost::shared_ptrます。彼らはあなたが探しているものを正確に提供します。

于 2011-08-31T00:33:31.817 に答える
6

関数によって返されるポインターに対して RAII を引き続き使用できます。次のように、スマート ポインターを使用できます (これはまさに、説明しているダミー クラスです)。

std::unique_ptr<TheApi::ApiObject> p_myObj(TheApi::createAnApiObj());
于 2011-08-31T00:34:04.557 に答える