4

私は次の(簡略化された)クラスを持っています:

class Operator {
private:
    std::map<std::string, std::unique_ptr<Operand>> op;

public:
    template <class T>
    void insertOperand(std::string const &s, T o = T()) {
        op.insert(std::pair<std::string, std::unique_ptr<StreamOperand>>(
            s, std::move(std::unique_ptr<T>(new T(o)))
        );
    }

    void setOperandsValue(std::string const &o, int v) {
        op.find(o)->second->setValue(v);
    }
};

Operand新しい作品を挿入しても問題ありません。ただし、関数が返されると、デストラクタが呼び出されるため、mapを呼び出すときにオブジェクトは含まれませんsetOperandsValue。私はDDDを使用してこれを観察しました:最後にinsertOperand Operator::~Operator()が呼び出されます。

std :: unique_ptrをSTLで使用することを確認した後、紹介しました(より良い:使用済み)std::moveが、正しく配置されていないか、何かが不足しています(知識不足が原因である可能性が高い)。利用できないので使用してmap::emplaceいません。

編集:デストラクタ呼び出しは、を破壊しているため、有効ですnew T(o)。とにかく、mapに入るときは空のままsetOperandsValueです。

編集#2:結果を入力setOperandsValueして実行すると、つまり、以前に追加したのにエントリが見つかりません。op.find(o)op.end

4

1 に答える 1

3

あなたのポインターが破壊されているとは思いません。ここに表示されているもの:

template <class T>
void insertOperand(std::string &s, T o = T()) {
    op.insert(std::pair<std::string, std::unique_ptr<StreamOperand>>(
        s, std::move(std::unique_ptr<T>(new T(o)))
    );
}

oで使用される割り当てられたヒープを構築するために使用された後Tのの破棄ですunique_ptr

マップが空であることは、ポインターが破棄されたことを示す兆候ではありません。この場合 (ポインターが破棄される)、指定されたキーのエントリがマップ内にあり、unique_ptr が無効になります。

于 2012-05-14T08:53:52.710 に答える