1

以下の状況で起こる挙動を確認したいです。次のように定義されたいくつかの関数があるとします。

std::vector<Object*> FuncA()
Result FuncB()

result はコンストラクタを持つクラスです

Result(const std::vector<Object*>& result)
{
    this->result = result;
}

ここで、FuncB は次のことを行います。

Result FuncB() {
 ... some stuff here ...
return Result(FuncA())
}

FuncA によって返されたベクトルはいつ破棄されますか (そのデストラクタが呼び出されます)? Result が範囲外になったときでしょうか。それへの参照を保持する結果は、その寿命を延ばしますか? そうでない場合は、理由と、私が求めていることを達成する方法を説明していただけますか?

ありがとう

編集:これが結果クラスです

class Result
    {
    private:
        std::vector<Object*> result;

        void SetData(const Result& other);
        void Free();

        // Constructs the result and takes ownership of the memory.
        Result(const std::vector<Object*>& result);

        Result();

    public:
        Result(const Result& other);
        Result& operator=(const Result& rhs);
        ~Result();

        const Object& operator [] (int index);
    };
4

2 に答える 2

2

参照を保持している場合Resultは、問題があります。によって返されるオブジェクトはFuncA、オブジェクトが返される前に破棄されResultます。

さて、Result値によって保持されます。これは、の戻り値がFuncAコンストラクターにコピーされることを意味します。Resultオブジェクトが破壊されると、ベクターは破壊されます。

コピーを避けたい場合は、コンストラクターで値によってオブジェクトを取得します

Result(std::vector<Object*> result) 
    : result(std::move(result))
{}

または、C++11 を使用しない場合 (@Steve Jessop のコメントを参照)

Result(std::vector<Object*> result) 
{
    this->result.swap (result);
}
于 2012-11-02T12:51:48.463 に答える
1

これは、やりたいことを実行するための間違った方法である可能性が最も高いです。ベクトルはResultスコープ外になると破棄されます。ベクトルのポインタが指すメモリはそうではありません。

したがって、ベクトルを返して引き続き使用できますが、そのベクトルのコピー内のポインターが解放されると、UB に遭遇します。

std::vector<std::shared_ptr<Object>>代わりに があると、多くの手間が省けます。

于 2012-11-02T12:52:25.700 に答える