gpt4 book ai didi

C++:析构函数在超出范围之前被调用?

转载 作者:可可西里 更新时间:2023-11-01 18:41:21 26 4
gpt4 key购买 nike

我在子例程末尾为类调用析构函数时遇到问题,即使它应该在子例程范围之外定义。

这是显示我的问题的最小代码片段:

#include <iostream>
using namespace std;

class Foo {
private:

double *array;

public:

Foo(int N) {
array = new double[N];
for (int i=0; i<N; i++) {
array[i]=0;
}
}

~Foo() {
delete[] array;
}
};

void subroutine(Foo x) {
cout << "Hello!" << endl;
}

int main() {
Foo bar(10);
subroutine(bar);
subroutine(bar);
}

现在对象 bar 的析构函数在第一个子例程完成后被调用,即使它的范围应该是整个 main() 函数?这意味着当我调用第二个子例程时,析构函数再次被调用,我得到了内存泄漏。

我发现我可以通过在子例程中通过引用调用来解决这个问题,但我对这个修复不是很满意,因为我不明白为什么它一开始就不起作用。任何人都可以为我阐明这一点吗?

谢谢。

最佳答案

您正在按值将 Foo 传递给 subroutine 函数。这意味着它有自己的拷贝,在退出其作用域时会被销毁。

void subroutine(Foo x) {
// x is a new Foo here. It will get destroyed on exiting scope,
// resulting in a destructor call
}

这里你的主要问题是你没有实现复制构造函数,所以动态分配的数组没有被复制(只有指向它的指针被复制)。因此,当您复制 Foo 对象时,每个拷贝都引用同一个数组。每个拷贝都会试图摧毁它。

您应该遵循 rule of three并实现一个赋值运算符和一个复制构造函数来制作数组的“深拷贝”,这样每个 Foo 对象都拥有自己的数组。

关于C++:析构函数在超出范围之前被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12747041/

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