簡體   English   中英

推回向量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM