将包含指针的数据插入向量

问题描述 投票:1回答: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正确更新了新的Op.But m_proceduralAssign有一个垃圾数据:Assignment中已经存在的m_proceduralAssign变成了空的m_operands和指向m_op的坏指针。并没有添加新的Assignment(我试图添加)。

你能告诉问题发生在哪里吗?如何解决?

c++ pointers vector stl
1个回答
2
投票

你应该重新审视你的设计。我现在看到你的代码的一个大问题是,对矢量对象的引用和指针经常失效(在push_backs和其他操作期间),所以通过返回指向新插入项的指针,你要求麻烦。如果我是你,我会考虑保存索引。

© www.soinside.com 2019 - 2024. All rights reserved.