C++ 将_推回向量

C++ 将_推回向量,c++,stdvector,C++,Stdvector,我有个奇怪的问题。我有一个向量,我想把物体推到上面,就像这样: vector<DEMData>* dems = new vector<DEMData>(); DEMData* demData = new DEMData(); // Build DEMDATA dems->push_back(*demData); 我不确定在这种情况下它是否与向量本身有关。。。使用指向向量和demData(而不是在堆栈上分配它们)的指针的方式看起来有点可疑 我希望正常的C++代码看

我有个奇怪的问题。我有一个向量,我想把物体推到上面,就像这样:

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

dems->push_back(*demData);

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

我希望正常的C++代码看起来像这样:

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

dems->push_back(demData);
...
delete dems;
vector*dems=newvector();
DEMData DEMData
//构建DEMDATA
dems->推回(demData);
...
删除DEM;

你能粘贴剩下的代码吗?或者可能是执行demData构建的循环?

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


您需要将向量存储为
DEMData*
,并
向后推
一个指针,而不是指向的值。

为什么要用新的值分配向量?为什么要将临时
DEMData
对象分配给新的

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

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

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

作为第一步,我将去掉所有指针字符成员,并用
std::string
s替换它们。
int
成员应该是正确的——复制它们将复制值


Edt2:考虑到你正在处理这些成员变量,看起来你应该考虑使用两个“代码> STD::MAP<代码/S>:一个用于<代码> STD::String 变量,一个用于<代码> int <代码>变量。< <代码> DeMase< /Cord>类需要一个复制构造函数和析构函数,以便管理字符串的内存。目前(可能)正在发生的是,创建了一个

DEMData
对象,插入到向量中,该向量创建了一个具有相同指针值的
DEMData
的新实例。然后销毁原始的
DEMData
(因为没有析构函数),这会使向量中的指针悬空。然后,当您创建一个新的
devmdata
时,它会获得相同的内存位置(碰巧),并且最终所有对象都指向相同的位置。

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

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

您能显示“使用更多上下文”吗?例如,这是否在函数中?另外,您使用动态内存分配的理由是什么?我们没有太多的代码,但您可能在这里有内存泄漏。push_back生成对象的副本。使用动态内存分配不是更有意义吗?因为很多原因,动态内存是要避免的。你应该只在必要的时候使用它。此外,上下文指的是第一个块中的代码,而不是DEMData:)我仍然没有得到正确的行为。我放了一个复制构造函数和一个析构函数。我想我错过了别的东西。我的向量的所有元素都具有相同的DEMData信息,就好像它们都指向同一个DEMData对象一样。不确定这是怎么可能的。即使这样,也没有理由在堆上有
dem
。另外,去掉
demData
后面的括号,否则您正在声明一个函数。@Orion Edwards:
demData demData()
是一个函数声明,而不是对象定义。2Jerry:在哪种情况下,用new分配向量会产生问题?也许这与当前的问题无关,但总的来说,有一个未经加工的指针挂在周围是不好的。它应该是堆栈分配的。如果真的需要动态分配,就应该打包。2GMan:代码中确实存在一些其他问题,我们是否应该找到它们?首先专注于实际问题是一件好事。@Vlad:使用new分配向量会使代码难以维护、难以理解,并且几乎不可能保证异常安全。
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);
vector<DEMData>* dems = new vector<DEMData>();
DEMData demData
// Build DEMDATA

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