在类生成临时对象时,遇到一个问题,程序会两次调用析构函数
#include <cstring>
#include <iostream>
using namespace std;
class stack
{
public:
stack(const char *value);
~stack();
char * data;
};
stack::stack(const char *value)
{
if(value)
{
data = new char[strlen(value)+1];
strcpy(data,value);
}
else
{
data = new char[1];
*data = '\0';
}
}
inline stack::~stack()
{
cout << "Destructor" << endl;
//delete []data; //此处会报错
}
void dosth(stack pstk)
{
cout << pstk.data << endl;
}
int main()
{
stack str("iamxczhang");
dosth(str);
return 0;
}
查了一些资料,还不是很清楚,但是经过仔细分析后,青年人网提示是系统调用默认拷贝构造函数的结果。
在返回对象和按值传递参数时,要生成临时对象,生成临时对象要调用默认拷贝构造函数。
通过这个例子更让加深了对Effective C++的理解。
只要类里有指针变量就得自己写拷贝构造函数和赋值函数,但是你确定用不着这些函数时,可以把这些函数做private声明而不去实现它,这就防止了会有人去调用它们,也防止了编译器去生成它们。
责任编辑:小草