2010-08-29 76 views
6

下面是代碼(也在http://pastebin.com/yw5z2hnG):C++太多的析構函數調用,所以幾個對象

#include <iostream> 
#include <vector> 
using namespace std; 

class X 
{ 
    public: 
    int i; 
    X(); 
    ~X(); 
}; 

X::X() 
{ 
    i = 1; 
    cout << "---constructor" << '\n'; 
} 

X::~X() 
{ 
    cout << "***desctructor" << '\n'; 
} 

int main() 
{ 
    vector<X> *vx = new vector<X>; 
    cout << "------------------------------------" << endl; 
    vx->push_back(X()); 
    vx->push_back(X()); 
    vx->push_back(X()); 
    vx->push_back(X()); 
    vx->push_back(X()); 
    cout << "------------------------------------" << endl; 
    delete vx; 
} 

我得到的輸出:

------------------------------------ 
---constructor 
***desctructor 
---constructor 
***desctructor 
***desctructor 
---constructor 
***desctructor 
***desctructor 
***desctructor 
---constructor 
***desctructor 
---constructor 
***desctructor 
***desctructor 
***desctructor 
***desctructor 
***desctructor 
------------------------------------ 
***desctructor 
***desctructor 
***desctructor 
***desctructor 
***desctructor 

我不明白爲什麼有那麼多的析構調用。

+1

這是一個重複多次......但我找不到它們導致人們問這個問題通常不知道隱式定義的拷貝構造函數:p我總覺得有趣的是,無知可能阻止人們學習,因爲它阻止了人們有效地查詢。 – 2010-08-29 11:34:25

回答

14

如果你定義自己的拷貝構造函數,你會看到正在建設中的其他對象:

class X 
{ 
    public: 
    int i; 
    X(const X&); 
    X(); 
    ~X(); 
}; 

X::X(const X& x) : i(x.i) 
{ 
    cout << "---copy constructor\n"; 
} 

// ... rest as before 

編譯器會提供,如果你不聲明自己的一個不執行任何記錄拷貝構造函數。

+0

+1:隱含副本是原因。 – Puppy 2010-08-29 10:26:26

1

一個細節 - 如果你提前爲您的載體預留空間:

int main() 
{ 
    vector<X> *vx = new vector<X>; 
    vx->reserve(5); 
    .... 

然後你會得到以下的輸出:

---constructor 
+++ copy constructor 
***desctructor 
---constructor 
+++ copy constructor 
***desctructor 
... 

因此,大家都可以看到載體也副本它的元素,當它需要重新分配其存儲 - 這就是爲什麼你得到5複製構造函數和析構函數的最後push_back()

+0

你的答案幫了很大忙。我現在儘可能地保留空間,不僅是矢量。我的程序運行速度更快。謝謝! – Xolve 2010-08-30 19:17:30

相關問題