需要帮助在类析构函数中释放内存

时间:2016-05-01 02:01:32

标签: c++

运行测试程序时收到以下错误:

http://i.stack.imgur.com/Nmhfs.png

如果我注释掉“删除名称”,错误就会消失,但我似乎无法弄明白为什么。希望有人可以让我深入了解解决方案。

#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;
}

1 个答案:

答案 0 :(得分:2)

使用时使用编译器定义的复制构造函数:

c3 = c2 + c1;

当您拥有从堆分配并在析构函数中释放的成员数据时,这是一个问题。

为您的班级添加适当的副本构造函数。

有关详细信息,请参阅The Rule of Three

您可以通过更改

来消除对用户定义的复制构造函数和复制赋值运算符的需求
string* name = new string;

string name;

并更改代码的其余部分。