2016-06-07 54 views
2

編輯:原來,無論我是否使用矢量這發生。它與具有自動銷燬的函數的局部對象有關,儘管我試圖顯式調用析構函數。析構函數調用兩次

我想弄清楚爲什麼我的對象顯然被刪除兩次。我正在試驗std :: vector類,並想知道如何處理刪除對象。任何人都可以啓發我在這種情況下發生了什麼?

代碼:

#include<iostream> 
#include<vector> 
#include"DummyClass.h" 
using namespace std; 

void main(void){ 
    //Make vector 
    vector<DummyClass> objVect1; 

    //Make objects to contain 
    DummyClass test; 

    //pass by value 
    objVect1.push_back(test); //makes a pass-by-value copy, I think? 


    //Delete the objects stored in the array 
    objVect1.clear(); // call dtor (vector's copy) 

    test.~DummyClass(); //call dtor on test 
}      //dtor called on test again? 

控制檯輸出:

0033F9DB was constructed 
0062C200 was destructed 
0033F9DB was destructed 
0033F9DB was destructed 

的最後一個對象被銷燬兩次。我想弄清楚發生了什麼事。似乎沒有傳入構造函數的參數傳遞給vector。任何人都可以幫我解決這個問題嗎?謝謝!

類的頭是:

#pragma once 
#include<iostream> 
class DummyClass 
{ 
public: 
    DummyClass(); 
    ~DummyClass(); 
}; 

類CPP是:

DummyClass::DummyClass() 
{  
    std::cout << this << " was constructed" << std::endl; 
} 

DummyClass::~DummyClass() 
{ 
    std::cout << this << " was destructed"<< std::endl; 
} 
+0

你確定載體與此有關嗎?你嘗試刪除它嗎? (修辭問題。) – juanchopanza

+0

其實,我剛剛刪除它,你說得對,矢量不是問題的一部分。 –

+0

'void main'產生**未定義的行爲**,因爲它無效。之後你沒有任何保證。 –

回答

3

的最後一個對象解構兩次。

一旦你明確地破壞它,然後再次當函數結束並且所有變量局部於該函數自毀時。這是未定義的行爲。

你幾乎不應該自己調用析構函數。

0

您不需要在main的結尾調用析構函數。一旦「測試」超出範圍,它會自動調用。刪除主要的最後一行。

0

push_back()將test複製到矢量中。當矢量得到clear()ed時,第一次調用析構函數,並且矢量中的副本被破壞。

析構函數在您顯式調用它時被第二次調用。

第三次當main()返回,test真的被摧毀。

3
DummyClass test; 

這個對象是在main功能,將走出去的範圍時main回報。 (1分析構函數調用)

objVect1.push_back(test); 

DummyClass的副本被添加到std::vector

objVect1.clear(); 

當調用clear時,副本被銷燬。(稱爲1分析構函數)

test.~DummyClass() 

你不應該顯式調用析構函數這個,它當對象超出範圍自動發生(即,當main函數返回)。 (1析構函數調用)

析構函數被稱爲3次,如上所示,對於2對象實例。應該刪除顯式的析構函數調用。

0

我不能評論,但我認爲第一個電話是在cleartest被刪除對象後發出的;第二個是你的電話。