push_back到向量

Bla*_*de3 3 c++ stdvector

我有一个奇怪的问题.我有一个矢量,我想把对象推到这样:

vector<DEMData>* dems = new vector<DEMData>();
DEMData* demData = new DEMData();
// Build DEMDATA

dems->push_back(*demData);
Run Code Online (Sandbox Code Playgroud)

向量中将有几百个DEMData对象.问题是当这段代码完成后,所有项目都等于最后一项"推回"到矢量?

为什么在向量中覆盖其他对象?

编辑:

DemData类很简单,只是一个带有setter和getter的数据结构:

    class DEMData
{
private:
    int bitFldPos;
    int bytFldPos;
    const char* byteOrder;
    const char* desS;
    const char* engUnit;
    const char* oTag;
    const char* valType;
    int index;
public:
    void SetIndex(int index);
    int GetIndex() const;
    void SetValType(const char* valType);
    const char* GetValType() const;
    void SetOTag(const char* oTag);
    const char* GetOTag() const;
    void SetEngUnit(const char* engUnit);
    const char* GetEngUnit() const;
    void SetDesS(const char* desS);
    const char* GetDesS() const;
    void SetByteOrder(const char* byteOrder);
    const char* GetByteOrder() const;
    void SetBytFldPos(int bytFldPos);
    int GetBytFldPos() const;
    void SetBitFldPos(int bitFldPos);
    int GetBitFldPos() const;
    friend std::ostream &operator<<(std::ostream &stream, DEMData d);
};
Run Code Online (Sandbox Code Playgroud)

编辑:

我正在读取XML文件并根据每个xml元素的属性构建DEMData对象:

DEMData demData;
  for (i = 0; attr[i]; i += 2)
  {
      if(strcmp(attr[i],"BitFldPos") == 0)
      {
      demData.SetBitFldPos(*attr[i + 1] - '0');
      }
      else if(strcmp(attr[i],"BytFldPos") == 0)
      {
        char* pEnd;
        int tmp = strtol(attr[i + 1],&pEnd,10);
        demData.SetBytFldPos(tmp);
      }
      else if(strcmp(attr[i],"ByteOrder") == 0)
      {
        demData.SetByteOrder(attr[i + 1]);
      }
      else if(strcmp(attr[i],"DesS") == 0)
      {
      demData.SetDesS(attr[i + 1]);
      }
      else if(strcmp(attr[i],"EngUnit") == 0)
      {
        demData.SetEngUnit(attr[i + 1]);
      }
      else if(strcmp(attr[i],"OTag") == 0)
      {
        demData.SetOTag(attr[i + 1]);
      }
      else if(strcmp(attr[i],"ValTyp") == 0)
      {
        demData.SetValType(attr[i + 1]);
      }
      else if(strcmp(attr[i],"idx") == 0)
      {
        char* pEnd;
        int tmp = strtol(attr[i + 1],&pEnd,10);
        demData.SetIndex(tmp);
      }
      //printf(" %s='%s'", attr[i], attr[i + 1]);
  }


  // Insert the data in the vector.
  dems.push_back(demData);
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 6

你为什么要用new分配向量?为什么DEMData要用新的临时对象分配?

A vector存储您传递给它的内容的副本,而不是该数据本身,因此除非您删除使用new分配的DEMData对象,否则在将项目推送到向量时会泄漏内存.同样,您通过动态分配向量来设置内存泄漏问题.

至于为什么向量中的对象似乎都包含相同的数据,很可能你有更多相同的东西 - 可能使用指针结合不正确的复制ctor,最终做了浅拷贝的几个地方它不应该但是 - 既然你还没有向我们展示那些代码,那只是猜测.

编辑:现在你已经为你的DEMData类添加了代码,它看起来非常像上面的猜测是正确的 - 你有指针而没有用户定义的拷贝ctor,所以你得到一个浅的副本.

作为第一步,我将摆脱所有指针char成员,并用std::strings 替换它们.该int成员应该没事吧-复制它们将复制值.

编辑2:鉴于你对这些成员变量做了什么,看起来很像你应该考虑使用两个std::maps - 一个用于std::string变量,一个用于int变量.