push_back到向量

时间:2010-02-22 21:08:37

标签: c++ stdvector

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

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

dems->push_back(*demData);

向量中将有几百个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);
};

编辑:

我正在读取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);

5 个答案:

答案 0 :(得分:6)

为什么要用新分配矢量?为什么要使用new分配临时DEMData对象?

vector存储传递给它的副本,而不是数据本身,所以除非您删除分配了new的DEMData对象,否则会泄漏内存永远你把一个项目推到矢量上。同样,您通过动态分配向量来设置内存泄漏问题。

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

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

作为第一步,我将摆脱所有指针char成员,并用std::string替换它们。 int成员应该没问题 - 复制它们会复制值。

Edit2:鉴于你对这些成员变量做了什么,看起来很像你应该考虑使用两个std::map s - 一个用于std::string变量,一个用于{{ 1}}变量。

答案 1 :(得分:3)

请注意,您的矢量不包含对象的引用,而是它们的副本。这意味着在向量中存储新创建的DEMData实例并更新对象后,向量中的相应条目将不会更新。

您需要使向量存储DEMData*push_back指针,而不是指向的值。

答案 2 :(得分:1)

我认为对象中的字符串是相同的。 大概你使用相同的demData对象来填充向量。

由于您使用默认复制构造函数,因此所有副本都包含相同的(char *)指针。 如果您更改这些指针引用的内存内容,则所有副本都会“看到”更改。

答案 3 :(得分:0)

您的DEMData类需要复制构造函数和析构函数才能管理字符串的内存。现在(可能)正在发生的是创建一个DEMData对象,插入到向量中,该向量创建具有相同指针值的DEMData的新实例。然后你破坏原始的DEMData(因为没有析构函数),它会在向量悬空中留下指针。然后,当您创建一个新的DEMData时,它会获得相同的内存位置(偶然),最后所有对象都指向相同的位置。

答案 4 :(得分:-2)

我不确定在这种情况下它是否与向量本身有关...你使用指针向量和demData的方式(而不是在堆栈上分配它们)看起来像有点可疑。

我希望普通的C ++代码看起来像这样:

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

dems->push_back(demData);
...
delete dems;

您可以粘贴其余代码吗?或者也许是构建demData的循环?