【发布时间】:2013-07-21 15:50:11
【问题描述】:
我有以下课程:
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;
IE。以下方法添加了一个新的操作:
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 已正确更新为新的 Op。但 m_proceduralAssign 有一个垃圾数据:m_proceduralAssign 中已存在的 Assignment 变为具有空 m_operands 和指向错误的指针m_op。
并且没有添加新的Assignment(我尝试添加)。
您能否告知问题发生在哪里?以及如何解决?
【问题讨论】: