2012-09-01 37 views
-3

我才知道,爲什麼要使用拷貝構造函數之一是避免後續崩潰的程序 -複製構造函數的動機 - 爲什麼我的程序不會崩潰?

#include <iostream> 
using namespace std; 

class Employee { 
public: 
    Employee(int ID,char const * name){...}; 
    ~Employee(){...}; 

    // Methods 
    void Print(); 

private: 
    // members 
    int m_ID; 
    char* m_name; 
}; 

void MyFunc(Employee emp) { 

    cout << "in MyFunc \n "; 

} 

int main() { 
    Employee One(1,"Garen Torosian"); 

// calling copy constructor 
    MyFunc(One); 

    cout << "In the end of main \n"; 

// Here the program crashes! 
    return 0; 
} 

,你可以看到該程序的return 0;之前應該崩潰,但是當我運行該程序它工作正常,並終止正常,爲什麼?

編輯:在這種情況下,程序確實崩潰 -

// Employee.h 
#include <iostream> 
using namespace std; 

class Employee { 
public: 
    Employee(int ID, 
        const char* name); 
    ~Employee(); 

    // Methods 
    void Print(); 

private: 
    // members 
    int m_ID; 
    char* m_name; 
}; 

// Employee.cpp 
#include "Employee.h「 

Employee::Employee(int iID, const char *name){ // Ctor 
    cout << "Constructor called" << endl; 
    m_ID = iID; 
    m_name = new char [strlen(name) +1]; 
    strcpy(m_name, name); 
    Print(); 
} 
void Employee::Print() { // Print 
cout << "ID: " << m_ID << ",Name:」 << m_name 
<< " ,Address(pointer):0x" << hex << (int) m_name<< endl; 
} 
Employee::~Employee() { // Dtor 
    cout << "Destructor called"<<endl; 
    Print(); 
    delete [] m_name; 
    m_name=NULL; 
} 

void MyFunc(Employee emp) { 

    cout << "in MyFunc \n ";  

} 

int main() 
{ 
    Employee One(1,"Eli Rachamim"); 

// calling copy constructor 
MyFunc(One); 

cout<< "In the end of main \n「; 

// Here the program crashes! 
return 0; 
} 
+3

取決於什麼在你的構造函數和析構函數...還有,UB意味着什麼* *可能發生,甚至根本工作。 – Xeo

+1

我猜在析構函數中有'delete this-> m_name()',崩潰是由於「double free detected」造成的。 – Greg

+0

@Greg我認爲你釘了它。在構造函數代碼中分配。優秀的心理調試。 –

回答

2

如果d-tor就像

~Employee(){ delete[] name; } 

,你分配存儲器的char*指針,你沒有copy c-tor,不是由編譯器生成copy c-tor,即做memberwise-copy,當您複製的對象將被調用。所以,會有double-free,在大多數情況下給你memory dump(實時調用析構函數已經破壞對象是UB和已刪除對象上調用delete[]UB)。但是如果你不使用內存 - copy c-tor,編譯器生成的效果很好。

編輯。

因此,您的第二個示例演示了d-tor對已存在的已銷燬對象以及double-free的調用。

1

爲什麼你認爲它應該崩潰?

如果你沒有提供自動生成的拷貝構造函數,那麼C++有一個不幸的功能,而你的MyFunc()並沒有真的做任何會被自動生成的拷貝搞砸的事情。

+0

'C++有一個不幸的功能,即在C++ 11中不提供自動生成的copy-constructor',只需'刪除'你想要的任何函數:) –

+1

不要你把_crash_和_compilation error_混淆了? – Lol4t0

相關問題