2016-10-03 58 views
-2

私はC++の初心者です。私はコピーコンストラクタを実装しようとしています。 コピーコンストラクタの正しい構文に従ったことを願っています。 しかし、私は自分のコードをコンパイルするたびにエラーなく終了しますが、実行時に "プログラムは終了コード10で終了しました"と表示されます。 私はClion IDEで作業しています。私がMac端末で試したところ、 "Bus error: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

呪われていないコピー(!) –

関連する問題