这为什么会发生在C++析构函数中? 我开始在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; }

这为什么会发生在C++析构函数中? 我开始在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; },c++,class,destructor,C++,Class,Destructor,我的问题是为什么它会显示最后3个释放?我理解他们中的第一个超出了int negdyna ob的范围。但为什么是最后两个呢?请提供帮助。因为您没有通过引用或地址将dyna ob传递给neg,所以每次调用时都会创建并销毁一个作用域位于函数本地的dyna。这将生成打印出来的前3个自由度。最后两个是当o和o2在main中被销毁时。我预计将执行5次析构函数。您有2个对象和3个临时对象。您的negdyna ob函数是按值传递的,因此它会创建对象的副本。尝试negconst dyna&ob通过引用传递。通过值

我的问题是为什么它会显示最后3个释放?我理解他们中的第一个超出了int negdyna ob的范围。但为什么是最后两个呢?请提供帮助。

因为您没有通过引用或地址将dyna ob传递给neg,所以每次调用时都会创建并销毁一个作用域位于函数本地的dyna。这将生成打印出来的前3个自由度。最后两个是当o和o2在main中被销毁时。

我预计将执行5次析构函数。您有2个对象和3个临时对象。您的negdyna ob函数是按值传递的,因此它会创建对象的副本。尝试negconst dyna&ob通过引用传递。通过值传递将创建一个临时对象,从而调用构造函数/析构函数。这会导致未定义的行为,因为副本的析构函数释放指针,但原始对象仍在使用它,然后在指针被销毁时再次释放它。@Garrett感谢您的回答!!!刚刚拿到:@ArifHamim请查看副本。了解3/5/0的规则以避免未定义的行为非常重要。@drescherjm好的,谢谢您的参考!!
-10
10
Freeing
20
-20
Freeing
20
-20
Freeing
Freeing
Freeing