2016-10-03 77 views
-2

我是C++的初學者。我試圖實現複製構造函數。 我希望我遵循了複製構造函數的正確語法。 但是,每當我編譯我的代碼,它將完成沒有任何錯誤,但在運行時它說「程序完成退出代碼10」。 我正在Clion IDE中工作。當我在Mac終端嘗試時,它顯示「總線錯誤:10」程序完成退出碼10

我可以找出複製構造函數導致此問題。 我試過評論它並運行該程序,它工作正常,當我取消註釋上述問題導致。

請幫我弄清楚我出錯的地方。

謝謝。

這裏是我的代碼:

#include <iostream> 

using namespace std; 

class Person { 
    char *name; 
    int age; 
public: 
    Person(); 
    Person (char *, int age = 18); 
    Person (const Person &p); 
    void output(); 
}; 

Person ::Person() { 
    name = new char[20](); 
    age = 0; 
} 

Person ::Person(char *str, int age) { 
    name = new char[50](); 
    strcpy(name, str); 
    this->age = age; 
} 

Person ::Person(const Person &p) { 
    strcpy(name, p.name); 
    age = p.age; 
} 

void Person ::output() { 
    cout << "\nName = " << name; 
    cout << "\nAge = " << age << endl; 
    cout <<"-------------------------------------------------------------------------------------------------------------------------\n"; 
} 

int main() { 
    Person p1; 
    Person p2("Name"); 
    Person p3 ("Name", 20); 
    Person p4 = p2; 

    cout << "\nThe Output of the Object Called by Default Constructor\n\n"; 
    p1.output(); 
    cout << "\nThe Output of the Object Called by Parameterised Constructor with Default Argument\n\n"; 
    p2.output(); 
    cout << "\nThe Output of the Object Called by Parameterised Constructor Overriding Default Argument \n\n"; 
    p3.output(); 
    cout << "\nThe Output of the Object Called by Copy Constructor (Copying p2 Object that is the second output)\n\n"; 
    p4.output(); 
    return 0; 
} 
+2

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

很可能你的程序在這裏崩潰:'strcpy(name,p.name);'你爲'name'分配的大小不一致。只需使用'char *'的'std :: string' instea即可。 –

+0

感謝這幫了我 – ganag

回答

0

分別是你分配
Person ::Person(const Person &p) { strcpy(name, p.name); age = p.age; }
在將數據複製到它之前,您應該爲您的成員name分配內存大小strlen(p.name)+1字節。

+0

照顧內存泄漏。 –

+0

這是非常真實的。析構函數必須釋放此類所擁有的任何動態內存。 – PazO

+0

不要大廈複製(!) –

相關問題