我遇到了一个问题,即使析构函数在子程序范围之外定义,也会在子程序结束时调用类的析构函数。
以下是展示我的问题的最小代码:
#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
的复制构造函数和复制赋值运算符。搜索“三法则”。 - CB Bailey