類物件作為實參傳入函式,函式是複製物件還是直接使用物件的問題
今天遇到了這樣一個問題:
include<iostream>;
using namespace std;
class A{
private:
int*p;
public:
A(int n){ p=new int[n]; };
~A(){
cout<<"呼叫解構函式"<<endl;
delete p;
}
};
void Fuc(A a){
cout<<"進入函式Fuc"<<endl;
}
int main(){
A a(5);
Fuc(a);
return 0;
}
使用的是CLion書寫編譯的。
輸出視窗報錯:
進入函式Fuc
呼叫解構函式
呼叫解構函式
test(12153,0x1198035c0) malloc: *** error for object 0x7fe295400620: pointer being freed was not allocated
test(12153,0x1198035c0) malloc: *** set a breakpoint in malloc_error_break to debug
設定斷點後發現,類A的物件a在Fuc結束後析構了一次,在main函式return 0;的時候又析構了一次。
我當時的問題是:a的生存週期不應該是整個main函式嗎?a作為實參傳入Fuc,Fuc應該是複製一份來使用,不應該在Fuc結束了之後直接把main裡的a析構了呀?
問同學後發現了錯誤。先附上解決方案:
#include<iostream>
using namespace std;
class A{
private:
int*p;
int l;
public:
A(int n){
p=new int[n];
l=n;
cout<<"構造"<<endl;
};
A(const A& C){
cout<<"拷貝函式"<<endl;
p = new int[C.l];
l=C.l;
int i;
for(i=0;i<l;i++){
p[i]=C.p[i];
}
}
~A(){
cout<<"呼叫解構函式"<<endl;
delete p;
}
};
void Fuc(A a){
cout<<"進入函式Fuc"<<endl;
}
int main(){
A a(5);
Fuc(a);
}
輸出:
構造
拷貝函式
進入函式Fuc
呼叫解構函式
呼叫解構函式
Process finished with exit code 0
解決的方法就是寫一個拷貝函式(建構函式的過載)。
“問題源於沒有重寫拷貝函式,類的內部變數如果只是int,char等的基本型別那麼編譯器可以自動寫拷貝函式,但是int *是陣列還是指向int的指標無法被編譯器識別,所以必須自己寫拷貝函式 。 在沒有拷貝函式的情況下,編譯器無法複製這個類所以那個func就沒有複製。”
感謝跑的飛快的田學長!?
相關文章
- 函式物件、物件、原型函式物件原型
- Python開發是程式導向、函式還是物件?Python教程Python函式物件
- 類與物件中想直接在主函式操作物件怎麼做物件函式
- Python開發是程式導向、函式還是物件?Python基礎!Python函式物件
- js的函式和物件JS函式物件
- js函式,arguments物件JS函式物件
- 例項物件和函式物件的區別物件函式
- JS function 是函式也是物件, 淺談原型鏈JSFunction函式物件原型
- JS-陣列、函式、類與物件JS陣列函式物件
- 函式物件、裝飾器、閉包函式函式物件
- axios為什麼可以使用物件和函式兩種方式呼叫?是如何實現的?iOS物件函式
- 物件及函式相關物件函式
- 建構函式建立物件函式物件
- JavaScript 表單、物件、函式JavaScript物件函式
- 幽默:男人想談“物件”,女人實際要的是“函式”關係物件函式
- C++中函式指標與函式物件C++函式指標物件
- PHP 函式庫精講之類與物件PHP函式物件
- 類别範本物件做函式引數物件函式
- 物件的生存期 記憶體 深度複製 複製建構函式 筆記物件記憶體函式筆記
- JS函式,物件,例項方法,物件方法理解JS函式物件
- 理清原型物件、 例項物件、建構函式原型物件函式
- 037:函式物件的過濾器函式物件過濾器
- 對JavaScript中函式物件的理解JavaScript函式物件
- 5-函式與物件的方法函式物件
- c++內建函式物件C++函式物件
- uniCloud雲函式概述---雲物件Cloud函式物件
- Python進階07 函式物件Python函式物件
- QT槽函式獲取訊號傳送物件QT函式物件
- 第一類物件(函式),閉包及迭代器物件函式
- python函式的入參和傳參Python函式
- 深度解讀《深度探索C++物件模型》之複製建構函式C++物件模型函式
- 物件和函式的區別就是物件可以儲存狀態物件函式
- C++ lambda 表示式與「函式物件」(functor)C++函式物件
- 函式: 函式是怎麼使用的?函式
- 6.5. 常用物件——6.5.5. 函式物件函式
- JavaScript 函式引數解構物件JavaScript函式物件
- C++ 常物件和常函式C++物件函式
- 建立派生類物件,建構函式的執行順序物件函式