我有一个奇怪的问题.我有一个矢量,我想把对象推到这样:
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)
你为什么要用new分配向量?为什么DEMData要用新的临时对象分配?
A vector存储您传递给它的内容的副本,而不是该数据本身,因此除非您删除使用new分配的DEMData对象,否则在将项目推送到向量时会泄漏内存.同样,您通过动态分配向量来设置内存泄漏问题.
至于为什么向量中的对象似乎都包含相同的数据,很可能你有更多相同的东西 - 可能使用指针结合不正确的复制ctor,最终做了浅拷贝的几个地方它不应该但是 - 既然你还没有向我们展示那些代码,那只是猜测.
编辑:现在你已经为你的DEMData类添加了代码,它看起来非常像上面的猜测是正确的 - 你有指针而没有用户定义的拷贝ctor,所以你得到一个浅的副本.
作为第一步,我将摆脱所有指针char成员,并用std::strings 替换它们.该int成员应该没事吧-复制它们将复制值.
编辑2:鉴于你对这些成员变量做了什么,看起来很像你应该考虑使用两个std::maps - 一个用于std::string变量,一个用于int变量.