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

C++ 需要帮助在类析构函数中释放内存吗,c++,C++,我在运行测试程序时收到以下错误: 如果我注释掉“删除名称”,错误就会消失,但我似乎不知道为什么。希望有人能给我一个解决方案的见解 #include<iostream> #include<string> using namespace std; class Shape { protected: string* name = new string; public: Shape(string str) { *name = str;

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

如果我注释掉“删除名称”,错误就会消失,但我似乎不知道为什么。希望有人能给我一个解决方案的见解

#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;
}
#包括
#包括
使用名称空间std;
阶级形态
{
受保护的:
字符串*名称=新字符串;
公众:
形状(字符串str)
{
*name=str;
}
~Shape()
{
delete name;//如果我注释掉这个,为什么我的程序会运行?
name=NULL;
}
虚拟双getArea()常量
{返回0;}
void setName(字符串str)
{*name=str;}
字符串getName()常量
{return*name;}
};
班级圈子:公共形态
{
私人:
双半径;
公众:
圆(字符串str=”“,双r=0):形状(str)
{radius=r;}
空隙设置半径(双r)
{radius=r;}
双getRadius()常量
{返回半径;}
虚拟双getArea()常量
{返回半径*半径*3.14;}
圆运算符=(常数圆&);
圆运算符+(常数圆&);
};
圆::运算符=(常数圆和右)
{
半径=右。半径;
归还*这个;
}
圆::运算符+(常数圆和右)
{
圈-圈;
tempCircle.radius=半径+右半径;
返回圈;
}
int main()
{
圆圈c1(“c1”,5);
圆圈c2(“c2”,10);
圆圈c3;
c3=c2+c1;

cout当您使用以下命令时,您正在使用编译器定义的复制构造函数:

c3 = c2 + c1;
当您有从堆中分配并在析构函数中解除分配的成员数据时,这是一个问题

向类中添加适当的复制构造函数

有关更多详细信息,请参阅

通过更改

string* name = new string;


并相应地更改其余代码。

当您使用以下命令时,您正在使用编译器定义的复制构造函数:

c3 = c2 + c1;
当您有从堆中分配并在析构函数中解除分配的成员数据时,这是一个问题

向类中添加适当的复制构造函数

有关更多详细信息,请参阅

通过更改

string* name = new string;



并相应地更改代码的其余部分。

为什么要这样做
string*name=new string;
?计数器
声明在哪里?我只是用一个字符串指针来测试我对正确使用带指针的复制构造函数的理解。@Matimio您的代码没有包含任何用户定义的复制构造函数,这是正确的整个问题你为什么要这样做
string*name=new string;
?计数器
在哪里声明?我只是用一个字符串指针来测试我对正确使用带指针的复制构造函数的理解。@Matimio你的代码不包含任何用户定义的复制构造函数,这就是整个问题,我的重载不是吗d操作符函数修复了这个问题?我的实现有什么问题吗?@Matimio对于
Shape
类,哪里有
操作符=
,它处理执行
std::string*
的深度复制?最终得到的是指向同一
std::string*的两个或更多不同类实例*
这意味着在第一个实例执行
delete
后情况会变糟。我只是用这个程序来学习即将到来的测试。我只是想看看是否可以正确使用带指针的复制构造函数。你的重载函数只部分正确。它们根本不处理基类部分。“我的重载运算符函数不能解决这个问题吗?”-只需使用
Shape(constshape&)尝试您的类=删除;
并查看编译器对此有何评论;-)与赋值运算符相同。我的重载运算符函数是否解决了这一问题?它们的实现是否有问题?@Matimio对于处理执行
std深度副本的
Shape
类,哪里有
运算符=
::string*
?最终得到的是两个或多个不同的类实例指向同一个
std::string*
,这意味着在第一个实例执行
delete
后,情况会变糟。我正在使用此程序为即将到来的测试学习。我只是想看看是否可以正确使用带有poin的复制构造函数ter.您的重载函数只部分正确。它们根本不处理基类部分。“我的重载运算符函数是否解决了这个问题?”-只需使用
Shape(const-Shape&)=delete;
尝试您的类,看看编译器对此有何评论;-)与赋值运算符相同。