为什么会两次调用析构函数

 

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

  1. #include <cstring>
  2. #include <iostream>
  3. using namespace std;

  4. class stack
  5. {
  6. public:
  7.     stack(const char *value);
  8.     ~stack();
  9.     char * data;
  10. };

  11. stack::stack(const char *value)
  12. {
  13.     if(value)
  14.     {
  15.         data = new char[strlen(value)+1];
  16.         strcpy(data,value);
  17.     }
  18.     else
  19.     {
  20.         data = new char[1];
  21.         *data = '/0';
  22.     }
  23. }

  24. inline stack::~stack()
  25. {
  26.  cout << "Destructor" << endl;
  27.  //delete []data; //此处会报错
  28. }

  29. void dosth(stack pstk)
  30. {
  31.     cout << pstk.data << endl;
  32. }

  33. int main()
  34. {
  35.  stack str("iamxczhang");
  36.  dosth(str);
  37.  return 0;
  38. }

查了一些资料,还不是很清楚,但是经过仔细分析后,发现原来是系统调用默认拷贝构造函数的结果。

在返回对象和按值传递参数时,要生成临时对象,生成临时对象要调用默认拷贝构造函数。

通过这个例子更让我加深了对Effective C++的理解。

只要类里有指针变量就得自己写拷贝构造函数和赋值函数,但是你确定用不着这些函数时,可以把这些函数做private声明而不去实现它,这就防止了会有人去调用它们,也防止了编译器去生成它们。

问题在于:
void dosth(stack pstk)
{
cout << pstk.data << endl;
}

用引用!
你这里有一个浅复制的问题

发这个贴子就是为了强调生成临时对象时要调用默认拷贝构造函数,因为有时候我们很容易忽略。当然如果用引用肯定不会有这个问题。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值