gpt4 book ai didi

c++ - c++什么时候程序不调用析构函数?

转载 作者:太空狗 更新时间:2023-10-29 23:26:19 24 4
gpt4 key购买 nike

代码如下:

#include <iostream>

using namespace std;

class C {
public:
C() {i = 6; cout << "A:" << i << endl;}

C(int i0) {i = i0; cout << "B:" << i << endl;}

~C() {cout << "C:" << i << endl;}
private:
int i;
};

int main(int argc, char* argv[]) {
cout << "X" << endl;
C *c = new C;
cout << "Y" << endl;
}

出于某种原因,该代码的输出是

X
A:6
Y

并且出于某种原因,一旦您到达代码末尾,就永远不会调用析构函数 (C:6)。这是为什么?此代码也确实调用了析构函数:

#include <iostream>

using namespace std;

class C {
public:
C() {i = 0; cout << "A:" << i << endl;}

C(int i0) {i = i0; cout << "B:" << i << endl;}

~C() {cout << "C:" << i << endl;}
private:
int i;
};

int main(int argc, char* argv[]) {
cout << "X" << endl;
C c;
cout << "Y" << endl;
}

最佳答案

因为你忘了写

delete c;

如果你只是继续你的程序而不删除一个用 new 实例化的变量,你将导致内存泄漏。

编辑,因为您编辑了您的问题:

如果你这样写

C c;
C c{1};
C c = C{1};

您创建一个具有自动存储持续时间的变量。一旦在退出中声明的函数(或更准确地说:一旦在退出中声明的 block ),它将超出范围。在这种情况下,会自动调用构造函数。

如果你写

C* c = new C{};

您创建了一个指向(新)C 的指针。指针本身具有自动存储持续时间,这意味着 c 也将超出范围。但是这个指针只保存了C类型对象的地址。而且这个对象只有在调用delete c;时才会被删除。如果您不调用 delete,您的程序将“忘记”对象的地址,但不会释放内存或销毁对象。那是内存泄漏。
然而,一旦您的程序结束,所有内存都将被释放(无需调用析构函数),因此在您的小示例中您不会注意到。

关于c++ - c++什么时候程序不调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35468185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com