【发布时间】:2012-09-26 15:45:17
【问题描述】:
我在子例程结束时为一个类调用析构函数时遇到问题,即使它应该在子例程范围之外定义。
这是显示我的问题的最小代码:
#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);
}
现在对象栏的析构函数在第一个子例程完成后被调用,即使它的作用域应该是整个 main() 函数?这意味着当我调用第二个子例程时,析构函数再次被调用,我得到了内存泄漏。
我发现我可以通过在子例程中通过引用调用来解决这个问题,但我对这个修复不是很满意,因为我不明白为什么它一开始就不起作用。 谁能帮我解释一下?
谢谢。
【问题讨论】:
-
给定你的析构函数,你需要定义或删除
Foo的拷贝构造函数和拷贝赋值运算符。搜索“三法则”。 -
“为一个类调用析构函数” - 你会发现,随着时间的推移,如果你一直区分 class 和 object。析构函数是在对象而不是类上调用的。
标签: c++ destructor