2012-05-14 5 views
4

を破壊します:マップにunique_ptrを挿入し、ポインタが、私は、次の(簡体字)クラスを抱えている

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作品を挿入します。しかし、関数が返ってくると、デストラクタが呼び出され、setOperandsValueを呼び出すときにmapにはオブジェクトが含まれません。私はDDDを使用してこれを観察しました:insertOperandの末尾にOperator::~Operator()が呼び出されます。

Using std::unique_ptr with STLを見てから、std::moveを紹介しましたが、正しく配置されていないか、何かが見つからない(知識が不足している可能性が高い)かのいずれかです。私は利用できないのでmap::emplaceを使用していません。

編集:デストラクタコールは有効で、new T(o)が破棄されています。とにかくmapは、setOperandsValueと入力すると空のままです。

編集#2:setOperandsValueを入力してop.find(o)結果を実行するには、すなわち、私は前にそれを追加しましたが、見つからなかったエントリop.endです。

+0

_insert(std :: move(std :: pair )_別のレベルのコピーをトリガーします – bobah

+1

デストラクタが呼び出される?そして、どのデストラクタ? – juanchopanza

+0

私はDDD/GDBでトレースしました。 'insertOperand'の最後に' Operand ::〜Operand() 'が呼び出されます。 –

答えて

3

私はあなたのポインタが破壊されているとは思わない。あなたがここで見ている:unique_ptrで使用Tを割り当てられたヒープを構築するために使用された後

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の破壊です。

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

+0

私には完全に意味がありますが、 'setOperandsValue'を入力すると' map'は空です。 –

+1

@SebastianDresslerあなたは別の問題があります:-)。しかしあなたは確かです*それは空ですか? – juanchopanza

+0

'setOperandsValue'を入力すると、' op.find(...) 'を実行すると、結果は' op :: end'であり、マップは空です。 –

関連する問題