1

私は次のクラスを持っています:

class Op
    {
    private:
        std::vector<std::string> m_operands;
        std::string m_op;
    public:
        Op(std::string op = "") : m_op(op){}
        std::string GenCode();
        void AddOperand(std::string& operand) ;
        std::vector<std::string> GetOperands() const { return m_operands; }
        std::string GetOp() const { return m_op; }
    };

クラスのインスタンスは に保存されstd::vector<Op> m_movOpVます。つまり、次のメソッドは新しい op を追加します。

Op* AddMovOp()
{
    Op op("MovOp");
    m_movOpV.push_back(op);
    return &m_movOpV.back();
}

さらに、次のように定義しました。

typedef std::pair<std::string,Op*> Assignment;
std::vector<Assignment> m_proceduralAssign;

したがって、Op を追加した後Assignment、次の関数を使用して生成できます。

void AddAssignment(ModuleVCodeGen::Op* op,const std::string& lExp)
{
    Assignment assignment = (Assignment)std::make_pair(lExp,op);
    m_proceduralAssign.push_back(assignment);
}

次のシナリオでは、問題が発生します。

1.Op* op1 = AddMovOp();
2.op1->AddOperand("operand1");
3.AddAssign(op,"1");
4.Op* op2 = AddMovOp();

手順 4 を実行した後、m_movOpVは new で正しく更新されます。ただし、ジャンク データがあります:は既に存在し、空の m_operands と への不適切なポインタを持ちOpます。そして、(私が追加しようとした)新しいものは追加されません。m_proceduralAssignAssignmentm_proceduralAssignm_opAssignment

問題が発生した場所と解決方法を教えてください。

4

1 に答える 1

2

設計を再検討する必要があります。あなたのコードで私が今見ている大きな問題は、ベクター オブジェクトへの参照とポインターが (push_backs やその他の操作中に) 頻繁に無効になることです。私があなただったら、代わりにインデックスを保存することを検討します。

于 2013-07-21T15:57:06.963 に答える