我有个奇怪的问题。我有一个向量,我想把对象推到上面,如下所示:
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);
发布于 2010-02-23 05:17:02
为什么要用new赋值向量?为什么要用DEMData
来分配临时的新对象呢?
vector
存储您传递给它的内容的副本,而不是数据本身,所以除非您删除使用DEMData分配的new对象,否则每当您将一个项目推送到向量上时,都会泄漏内存。同样,通过动态分配向量,您也在为自己设置内存泄漏问题。
至于为什么向量中的所有对象似乎都包含相同的数据,很可能您有更多相同的数据--可能是使用了指针和不正确的复制ctor,最终在一些不应该的地方进行了浅层复制--但由于您没有向我们展示这些代码,这只是一种猜测。
编辑:现在您已经为您的DEMData类添加了代码,看起来上面的猜测非常正确--您有指针,没有用户定义的复制ctor,所以您得到了一个浅层的复制。
作为第一步,我会去掉所有的指针字符成员,并用std::string
替换它们。int
成员应该没问题--复制它们就会复制值。
Edit2:根据您对这些成员变量所做的操作,看起来您应该考虑使用两个std::map
--一个用于std::string
变量,另一个用于int
变量。
发布于 2010-02-23 05:16:02
请注意,向量保存的不是对对象的引用,而是它们的副本。这意味着在向量中存储新创建的DEMData
实例并更新对象后,向量中的相应条目将不会被更新。
你需要让你的向量存储DEMData*
,push_back
是一个指针,而不是一个指向的值。
发布于 2010-02-23 05:24:09
我认为对象中的字符串是相同的。假设您使用相同的demData对象来填充向量。
因为你使用默认的拷贝构造函数,所以所有拷贝都包含相同的(char*)指针。如果您更改了这些指针所引用的内存的内容,所有副本都会‘看到’这些更改。
https://stackoverflow.com/questions/2314196
复制相似问题