在类生成临时对象时,遇到一个问题,程序会两次调用析构函数
- #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声明而不去实现它,这就防止了会有人去调用它们,也防止了编译器去生成它们。
问题在于:
void dosth(stack pstk)
{
cout << pstk.data << endl;
}
用引用!
你这里有一个浅复制的问题