0

Person クラスがあります。この Person クラス内には、基本クラスであるポインター Strategy オブジェクトがあります (継承/ポリモーフィズムを使用しています)。

Strategy* strat;

パーサークラスもあります。そして、パーサー クラスで次の 2 行のコードを言います。

StrategyType* newStrat; = new StrategyType;
person.strat = newStrat

StrategyType は、基本クラス Strategy の階層の一部です。そして今、プログラムの最後でstratを削除したいので、メモリリークを引き起こしません。基本的にstratを削除する Person デストラクタを作成しました。しかし、問題は、私の Person デストラクタが私の Parser クラス内で呼び出され、そこで Person オブジェクトがスコープ外になることです。Person オブジェクトをそれよりも長く存続させたいと考えています。この問題を解決するために、Person オブジェクトを動的に割り当てることもできます。しかし、新しい問題は、動的に割り当てられた Person オブジェクトを削除するにはどうすればよいかということです。

4

2 に答える 2

2

私の理解では、Parser クラスに Person オブジェクトがある状況がありますが、Person オブジェクトが Parser オブジェクトよりも長く存続できるようにする必要があります。これがstd::shared_ptr目的です。

class Parser
{
public:
    Parser(std::shared_ptr<Person> person)
        :m_person(std::move(person))
    {
        // probably want to use a unique_ptr for strat, but one thing at a time
        m_person->strat = new StrategyType;
    }
private:
    std::shared_ptr<Person> m_person;
};

int main()
{
    auto person = std::make_shared<Person>();

    {
        Parser parser(person);
        // parser shares person            
    }
    // parser is destroyed, but person lives on

    person->do_something();
}
于 2012-11-18T18:31:26.657 に答える
0

shared_ptr と unique_ptr の組み合わせが必要だと思います。戦略タイプは基本クラスの 1 つにある必要があり、必要に応じて共有/一意の ptr を使用する必要があります。ここでは今のところ unique_ptr です。そうすれば、再割り当てがリークしないか、既に割り当てられているかどうかを確認できます。

メンバー変数を公開したくないのは明らかですが、ここではデモンストレーション用です。

#include <memory>

class StrategyType
{};

class PersonBase
{
public:
    std::unique_ptr<StrategyType> strat;
};

class Person : public PersonBase
{
public:

    void do_something()
    {
        double d = 0;
        d = d + 9;
        d = d * d;
    }
};

class Parser
{
public:
    //  makes no sense in moving shared_ptr
    //  hence pass by value
    Parser(std::shared_ptr<Person> _person)
        :m_person(_person)
    {
        // probably want to use a unique_ptr for strat, but one thing at a time
        m_person->strat.reset(new StrategyType);
    }
private:
    std::shared_ptr<Person> m_person;
};

int main()
{
    auto person = std::make_shared<Person>();

    {
        Parser parser(person);
        // parser shares person            
    }
    // parser is destroyed, but person lives on

    person->do_something();
}
于 2012-11-18T19:02:08.053 に答える