を破壊します:マップに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
です。
_insert(std :: move(std :: pair)_別のレベルのコピーをトリガーします –
bobah
デストラクタが呼び出される?そして、どのデストラクタ? – juanchopanza
私はDDD/GDBでトレースしました。 'insertOperand'の最後に' Operand ::〜Operand() 'が呼び出されます。 –