我遇到了在子例程結束時調用析構函數的問題,即使它應該在子例程範圍之外定義。C++:析構函數在超出範圍之前被調用?
這裏是最小的代碼我有一個顯示我的問題:
#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);
}
現在對於對象條這裏獲得的第一個子程序之後調用析構函數中完成,即使它的範圍應該是整個的主功能?這意味着當我調用第二個子例程時,會再次調用析構函數,並且發生內存泄漏。
我發現我可以通過在子程序中引用來解決這個問題,但我不是很滿意這個修補程序,因爲我不明白它爲什麼不起作用。 任何人都可以爲我闡述一些這方面的信息嗎?
謝謝。
鑑於您的析構函數,您需要定義或刪除'Foo'的複製構造函數和複製賦值運算符。搜索「三個規則」。 –
「爲類調用析構函數」 - 您會發現,隨着時間的推移,如果您一直區分**類**和** **對象**,事情會變得更加清晰。析構函數在**對象**上不在類上調用。 –