【发布时间】:2016-10-28 10:33:07
【问题描述】:
以下代码有一个名为String的用户定义数据类型。此类的对象存储一个字符指针str(字符串的简写)和length。
#include<iostream>
#include<cstring>
using namespace std;
class String
{
char* str;
int length;
public:
String(){} //default constructor
String(const char* s)
{
length=strlen(s);
str=new char[length+1];
strcpy(str,s);
}
void add(String a,String b) //function to concatenate strings
{
length=a.length+b.length;
str=new char[length+1];
strcpy(str,a.str);
strcat(str,b.str);
}
void display()
{
cout<<str<<endl;
}
~String() //destructor
{
delete str;
cout<<"Destructor invoked!";
}
};
int main()
{
String s1;
String s2("Well done!");
String s3("Boy");
s1.add(s2,s3);
s1.display();
s2.display();
s3.display();
}
输出:
Destructor invoked!Destructor invoked!Well done!boy
X!!;
<!!;
Destructor invoked!Destructor invoked!Destructor invoked!
- 看起来好像在调用析构函数之前
display函数被调用。为什么会这样?
如果没有定义析构函数,我会得到以下输出(如预期):
Well done!boy
Well done!
boy
- 为什么在定义析构函数时会出现这种意外输出?
【问题讨论】:
-
析构函数被调用是因为
add的参数被销毁了。 -
而且您的班级不符合 Rule-of-3。您至少需要添加复制构造函数和复制赋值运算符。
-
你有两个内存泄漏和双重删除。查看
add和what is the rule of three?。 -
delete str应该是delete[] str;- 你在add中也有内存泄漏 -
还需要在默认构造函数中初始化成员。
标签: c++ destructor