当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++基础入门教程

编程:两次调用析构函数

    在类生成临时对象时,遇到一个问题,程序会两次调用析构函数

 #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声明而不去实现它,这就防止了会有人去调用它们,也防止了编译器去生成它们。

相关内容
赞助商链接