2013-04-08 134 views
2

看起來我的對象在執行push_back到std :: list後發生了變化。爲什麼我的對象在list :: push_back()之後改變

這是之前的push_back對象: object before push_back

查看如何經過一番有效m_parent_reference指針時,它最終成爲nullptr從而結束鏈。

這是我對象的push_back後的外觀() object after push_back

現在還沒有nullptr了。相反,一個parent_reference引用其子,創建一個永無止境的循環。

  1. m_InterchangeList的類型是std::list<CKerEDIInterchange>
  2. m_parent_reference的類型是從CKerEDIReference
  3. 無論CKerEDIInterchange也不CKerEDIReference有一個自定義拷貝構造函數CKerEDIReference
  4. CKerEDIInterchange繼承
  5. 我已經測試與Visual Studio 2010這一行爲SP1和Visual Studio 2012更新2
  6. 變量m_parent_reference只能通過構造
      CKerEDIReference(const CKerEDIReference* const parent_reference = NULL) 
         : m_parent_reference(parent_reference) {}; 
    

設置通過自定義的拷貝構造函數和賦值操作符,我可以注意以下幾點:

  1. 指定運營商從來不被稱爲
  2. 參考給` CKerEDIReference :: CKerEDIReference(const CKerEDIReference &)已經被破壞了,因爲它已經有了這個永無止境的循環。

編輯 更多的相關信息:

  1. 調用{CKerEDIInterchange tmp(nInterchange);}不 不會導致損壞的對象。
  2. 不涉及切片。 m_InterchangeList是type std::list<CKerEDIInterchange>和nInterchange如果類型 CKerEDIInterchange

的我真的很想知道,如果任何人都可以給我一個提示去哪裏找下一個。

由於提前, 尼克Papagiorgio

+3

你不應該發佈代碼,而不是*幫助重現問題。你應該發佈一些確實顯示問題的代碼。我們應該如何找出其他問題呢? – 2013-04-08 13:41:27

+0

您的父引用是否有任何機會指向'm_InterchangeList'中的項目?因爲當列表內部調整大小時,指針變得無效。 – riv 2013-04-08 13:43:50

+1

沒有拷貝構造函數,但是你的類是否具有析構函數? – john 2013-04-08 13:44:13

回答

0

我發現FO這種現象的原因。 顯然這些CKerEDIReference對象之一已被刪除。通過將新對象添加到列表中,新的listitem被寫入到該刪除對象的內存中。我想這只是純粹的巧合,它並沒有崩潰。

相關問題