2012-03-07 146 views
0

我正在用std::vector來保存一些具有動態分配成員的對象,當我將事物放入向量中時,發生了一些我不瞭解的事情。C++矢量問題

  1. 我打電話push_back()和使用的對象作爲參數的構造函數,但由於某種原因它關係到該對象的析構函數。爲什麼是這樣;它應該添加不刪除?

  2. 我再次打電話push_back()與以前一樣,但是這次它會拋出非法內存訪問dbgdel.cpp操作員刪除(第52行)。但刪除不應該在構造函數中調用,或者push_back()

我不確定哪些代碼段與此問題相關,因爲所討論的行在方法中是非常根深蒂固的。

編輯:代碼添加

class Thing{ 
    int** Array; 
    int size; // of square array 
    Point current; // location 
    Thing(int _n){ 
     // allocates, and gives values to the array, and members 
     // only constructor 
    } 
}; 
class ThingMgr{ 
    Thing * Control; 
    Thing * Current; 
    Thing * Previous; 
    int size; // size of all. same use as in Thing 
    ThingMgr(int _n){ 
     size = _n; 
     Control = new Thing(size); 
     Current = new Thing(size); 
     Previous = new Thing(size); 
    } 
    void rearrange(int _num){ 
     std::vector<Thing> possibles; 

     // performs deterministic work on members 

     // [0] first 
     possibles.push_back(Thing(size)); // this succeeds 
     // [1] second 
     possibles.push_back(Thing(size)); // this fails 

     // more operations to be performed never reached. 
    } 
}; 
+0

你可以發表包含push_back()的行嗎?我懷疑你正在將一個對象複製到向量中,因此創建,複製並破壞了一個對象(因此調用析構函數) – 2012-03-07 21:58:07

+0

爲什麼你不顯示實際的代碼?我不相信您的散文描述與術語準確地匹配,因爲術語看起來有點......未定義 – sehe 2012-03-07 21:58:36

+0

在push_back過程中,vector類允許使用其複製構造函數創建對象的副本,然後其中一些副本可能會被銷燬並且它們的析構函數會被調用。你有一個有效的複製構造函數給你的類嗎? – 2012-03-07 21:59:34

回答

3

第一:我叫的push_back()和使用的對象作爲參數的構造函數,但由於某種原因它關係到該對象的析構函數。爲什麼是這樣;它應該添加不刪除?

您正在推動該元素的副本vector。您構建一個時間元素,調用其複製構造函數以在vector內創建副本,然後調用時間元素的析構函數。

第二次:我再次調用push_back()和以前一樣,但是這次它在dbgdel.cpp operator delete(第52行)拋出非法內存訪問。但絕不應該在構造函數或push_back()中調用delete。

很奇怪的是,這發生在第二個電話,但最終vector需要再次重新長出它複製元素時。

您可能無法爲相關元素提供適當的複製構造函數。

+0

很高興提及'emplace_back'以避免副本 – sehe 2012-03-07 22:02:39

+0

@sehe:但是我沒有提到它,因爲OP沒有使用** C++ 11 **。隨意編輯我的問題添加它。 – 2012-03-07 22:06:23

1

您是否將指針存儲在向量中,還是正在複製到它中?例如,是:

class MyClass; 
vector<MyClass> my_vector; 
//or 
vector<MyClass*> my_vector; 

如果它是第一個,然後當你打電話push_back()你創建一個新對象的本地副本,矢量使得副本在矢量存儲,然後你暫時離開範圍並遭到破壞。

至於第二次,我猜你的類沒有寫入正確處理副本,所以你的臨時實例的析構函數刪除了一些東西,但副本仍然引用相同的指針。然後,當它由於某種原因而被刪除(或者你的新的由於某種原因引用相同的東西)時,它會中斷。很難說沒有看到你的課程的代碼。

+0

向問題添加代碼 – gardian06 2012-03-07 22:15:40