【问题标题】:Why this is happening with C++ destructor? [duplicate]为什么 C++ 析构函数会发生这种情况? [复制]
【发布时间】:2018-03-01 18:31:50
【问题描述】:

我开始学习 c++ 中的类,所以想法析构函数对我来说有点混乱。这是我试图了解如何调用析构函数的示例代码。

#include<bits/stdc++.h>
using namespace std;

class dyna
{
int *p;
public:
    dyna(int i);
    ~dyna() { delete(p); cout<<"Freeing"<<endl; }
    int get()
    {
    return *p;
    }
};

dyna::dyna(int i)
{
    p = new int;
    *p = i;
}

int neg(dyna ob)
{
    return -ob.get();
}

int main()
{
    dyna o(-10);
    cout<<o.get()<<endl;
    cout<<neg(o)<<endl;

    dyna o2(20);
    cout<<o2.get()<<endl;
    cout<<neg(o2)<<endl;

    cout<<o.get()<<endl;
    cout<<neg(o)<<endl;

    return 0;
}

输出:

-10
10
Freeing
20
-20
Freeing
20
-20
Freeing
Freeing
Freeing

我的问题是为什么它显示最后 3 个“释放”?我首先了解他们超出了 int neg(dyna ob) 的范围。但是为什么最后两个呢?请帮忙。

【问题讨论】:

  • 我希望析构函数执行 5 次。您有 2 个对象和 3 个临时对象。
  • 您的“neg(dyna ob)”函数是按值传递的,因此它会创建对象的副本。尝试“neg(const dyna &ob)”通过引用传递。
  • 按值传递将创建一个临时对象,因此会调用构造函数/析构函数。

标签: c++ class destructor


【解决方案1】:

因为您没有通过引用或地址将dyna ob 传递给neg,所以每次调用时都会创建并销毁具有函数本地范围的dyna。这将产生您看到打印出来的前 3 个Freeings。最后两个是oo2main 中被销毁时。

【讨论】:

  • 这会导致未定义的行为,因为副本的析构函数释放了指针,但原始对象仍在使用它,然后在销毁时再次释放它。
  • @Garrett 谢谢你的回答!!!现在才知道:)
  • @ArifHamim 请查看副本。了解 3 / 5 / 0 的规则以避免未定义的行为非常重要。
  • @drescherjm 好的,谢谢参考!!
猜你喜欢
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 2022-10-15
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 2010-09-22
相关资源
最近更新 更多