[英]push_back to a Vector
我有一個奇怪的問題。 我有一個向量,我想將對象推到這樣:
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);
為什么要分配帶有new的向量? 為什么要用new分配臨時DEMData
對象?
vector
存儲傳遞給它的內容的副本 ,而不是數據本身,因此,除非您刪除使用new分配的DEMData對象,否則每當將項目推入向量時,都會泄漏內存。 同樣,通過動態分配向量來設置內存泄漏問題。
至於為什么向量中的所有對象似乎都包含相同的數據,您很有可能擁有更多的相同數據-可能是結合使用了指針和不正確的復制ctor,最終導致在不應該復制的幾個位置進行淺復制不是-但是由於您沒有向我們展示該代碼,所以這只是一個猜測。
編輯:現在,您已經為DEMData類添加了代碼,看起來非常像上面的猜測是正確的-您具有指針並且沒有用戶定義的副本ctor,因此您得到的是淺表副本。
第一步,我將擺脫所有指針char成員,並用std::string
替換它們。 int
成員應該沒問題-復制它們將復制值。
Edit2:鑒於您正在使用這些成員變量,看起來很像您應該考慮使用兩個std::map
s-一個用於std::string
變量,另一個用於int
變量。
請注意,向量不包含對對象的引用,而是對對象的副本 。 這意味着在將新創建的DEMData
實例DEMData
在向量中並更新對象之后,向量中的相應條目將不會更新。
您需要使向量存儲DEMData*
,並push_back
一個指針,而不是指向的值。
我想對象中的字符串是相同的。 大概您使用相同的demData對象來填充向量。
並且由於您使用默認的副本構造函數,因此所有副本都包含相同的(char *)指針。 如果您更改這些指針引用的內存內容,則所有副本都“看到”更改。
您的DEMData
類需要復制構造函數和析構函數才能管理字符串的內存。 DEMData
目前情況(可能)發生的是,創建了一個DEMData
對象,將其插入向量中,該向量將創建一個具有相同指針值的DEMData
新實例。 然后,銷毀原始的DEMData
(因為沒有析構函數),從而使指針懸空在向量中。 然后,當您創建新的DEMData
它將獲得相同的內存位置(偶然),最后所有對象都指向相同的位置。
我不確定在這種情況下是否與向量本身有關...您使用指向向量和demData
指針(而不是在堆棧上分配它們)的方式看起來有點可疑。
我希望普通的C ++代碼看起來像這樣:
vector<DEMData>* dems = new vector<DEMData>();
DEMData demData
// Build DEMDATA
dems->push_back(demData);
...
delete dems;
您可以粘貼其余代碼嗎? 還是demData建立的循環?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.