2016-05-01 11 views
0

にヘルプの割当て解除のメモリが必要理由を理解しているようだ。うまくいけば、誰かが私に解決策についての洞察を与えることができます。は、私は私のテストプログラムを実行すると、私は次のエラーが表示され、クラスデストラクタ

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

class Shape 
{ 
protected: 
    string* name = new string; 
public: 
    Shape(string str) 
    { 
     *name = str; 
    } 
    ~Shape() 
    { 
     delete name; //Why does my program run if I comment this out? 
     name = NULL; 
    } 

    virtual double getArea() const 
     { return 0; } 
    void setName(string str) 
     { *name = str; } 
    string getName() const 
     { return *name; } 
}; 

class Circle : public Shape 
{ 
private: 
    double radius; 
public: 
    Circle(string str = "", double r = 0) : Shape(str) 
     { radius = r; } 
    void setRadius(double r) 
     { radius = r; } 
    double getRadius() const 
     { return radius; } 
    virtual double getArea() const 
     { return radius * radius * 3.14; } 

    Circle operator= (const Circle &); 
    Circle operator+ (const Circle &); 
}; 

Circle Circle::operator= (const Circle &right) 
{ 
    radius = right.radius; 
    return *this; 
} 

Circle Circle::operator+ (const Circle &right) 
{ 
    Circle tempCircle; 
    tempCircle.radius = radius + right.radius; 
    return tempCircle; 
} 

int main() 
{ 
    Circle c1("c1",5); 
    Circle c2("c2",10); 
    Circle c3; 

    c3 = c2 + c1; 

    cout << "c1" << c1.getRadius() << endl; 
    cout << "c2" << c2.getRadius() << endl; 
    cout << "c3" << c3.getRadius() << endl; 
    return 0; 
} 
+0

なぜこの 'string * name = new string;'をやっているのですか? –

+0

「counter」はどこに宣言されていますか? –

+0

私はちょうどポインタを持つコピーコンストラクタを使って私の理解をテストするために文字列ポインタを使用しています。 –

答えて

2

使用するときは、コンパイラ定義されたコピーコンストラクタを使用している:

c3 = c2 + c1; 

ヒープから割り当てられ、デストラクタで割り当て解除されますが、メンバーのデータを持っている問題であること。

クラスに適切なコピーコンストラクタを追加します。

詳細については、The Rule of Threeを参照してください。

あなたは、ユーザー定義のコピーコンストラクタの必要性を回避し、

string name; 

string* name = new string; 

を変更し、コードのaccordinlgyの残りの部分を変更することにより、代入演算子をコピーすることができます。

+1

....ですが、文字列*が使用される理由は明らかではありません。 – VolkerK

+0

私のオーバーロードされた演算子関数はそれを修正していませんか?私の実装に何か問題はありますか? –

+0

@Matimio 'std :: string *'のディープコピーを実行する 'Shape'クラスの' operator = 'はどこにありますか?あなたがやっているのは、2つ以上の異なるクラスインスタンスが同じ 'std :: string *'を指していることです。つまり、最初のインスタンスによって 'delete'が実行された後に状態が悪くなることを意味します。 –

関連する問題