在类生成临时对象时,遇到一个问题,程序会两次调用析构函数
#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声明而不去实现它,这就防止了会有人去调用它们,也防止了编译器去生成它们。