首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向量的push_back

向量的push_back
EN

Stack Overflow用户
提问于 2010-02-23 05:08:37
回答 5查看 2.2K关注 0票数 3

我有个奇怪的问题。我有一个向量,我想把对象推到上面,如下所示:

代码语言:javascript
运行
复制
vector<DEMData>* dems = new vector<DEMData>();
DEMData* demData = new DEMData();
// Build DEMDATA

dems->push_back(*demData);

向量中将有几百个DEMData对象。问题是,当这段代码完成时,所有的项都等于最后一项“推回”到向量?

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

编辑:

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

代码语言:javascript
运行
复制
    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对象:

代码语言:javascript
运行
复制
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);
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-23 05:17:02

为什么要用new赋值向量?为什么要用DEMData来分配临时的新对象呢?

vector存储您传递给它的内容的副本,而不是数据本身,所以除非您删除使用DEMData分配的new对象,否则每当您将一个项目推送到向量上时,都会泄漏内存。同样,通过动态分配向量,您也在为自己设置内存泄漏问题。

至于为什么向量中的所有对象似乎都包含相同的数据,很可能您有更多相同的数据--可能是使用了指针和不正确的复制ctor,最终在一些不应该的地方进行了浅层复制--但由于您没有向我们展示这些代码,这只是一种猜测。

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

作为第一步,我会去掉所有的指针字符成员,并用std::string替换它们。int成员应该没问题--复制它们就会复制值。

Edit2:根据您对这些成员变量所做的操作,看起来您应该考虑使用两个std::map --一个用于std::string变量,另一个用于int变量。

票数 6
EN

Stack Overflow用户

发布于 2010-02-23 05:16:02

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

你需要让你的向量存储DEMData*push_back是一个指针,而不是一个指向的值。

票数 3
EN

Stack Overflow用户

发布于 2010-02-23 05:24:09

我认为对象中的字符串是相同的。假设您使用相同的demData对象来填充向量。

因为你使用默认的拷贝构造函数,所以所有拷贝都包含相同的(char*)指针。如果您更改了这些指针所引用的内存的内容,所有副本都会‘看到’这些更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2314196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档