2013-04-24 49 views
3

出於某種原因,在主函數中創建一個對象之後,析構函數被立即調用,是不是應該只在主完成時調用?感謝析構函數在範圍結束前被調用

代碼:

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


class check{             //create class check 
public: 
    string m_bank_name; 
    int m_check_number; 
    int m_branch_number; 
    char* m_check_sum; 



    check (string bank_name, int check_number, int branch_number, char* check_sum){ 
     int a_size = (strlen(check_sum)+1); 
     m_check_sum = new char[a_size](); 
     for (int i=0;i<a_size;i++) 
     { 
      m_check_sum[i]=check_sum[i]; 
     } 
     m_bank_name= bank_name; 
     m_check_number = check_number; 
     m_branch_number = branch_number; 
    } 

    ~check(){ 
     delete [] m_check_sum; 
     cout<<"deleted!"<<endl;  
     } 
}; 

void main(){ 

    check ob1= check("poalim",809877,12,"4578"); 
    cout<<ob1.m_check_sum<<endl; 
    getchar(); 
} 
+0

如果您將'm_check_sum'類型更改爲'std :: string'(或'std :: vector '或其他具有值語義的其他類型),那麼您將不需要析構函數,也不會需要遵循[Rule of Three](http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)),並且您不會在乎過早或過於頻繁地調用析構函數。 – 2013-04-24 17:14:54

回答

5

這種表達

check("poalim",809877,12,"4578") 

創建得到充分表達後立即銷燬臨時對象;

被破壞之前,它被複制到() ob1,它在主函數結束時被銷燬。

也許你的意思是寫

int main(){ //note the correct return type of main 
    check ob1("poalim",809877,12,"4578"); //direct constructor call 
    cout<<ob1.m_check_sum<<endl; 
    getchar(); 
} 

我真的建議你閱讀good book on C++基本面。

+0

它怎麼會創建一個臨時對象?我應該如何以不會創建臨時對象的方式初始化「檢查」對象? – user1887990 2013-04-24 17:09:39

+0

@ user1887990:看我的編輯 – 2013-04-24 17:10:01

+0

哦,是的,是對的,猜我太累了,謝謝,我會在8分鐘內接受答案,當它讓我! – user1887990 2013-04-24 17:12:04

相關問題