我有一个奇怪的问题。我有一个矢量,我想把对象推到这样:
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);
答案 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的循环?