類物件作為實參傳入函式,函式是複製物件還是直接使用物件的問題
今天遇到了這樣一個問題:
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就沒有複製。”
感謝跑的飛快的田學長!?
相關文章
- Scala:數字是物件,函式也是物件!物件函式
- 物件,函式作為一個函式的引數物件函式
- 類函式和物件函式 PHP函式物件PHP
- 函式物件、物件、原型函式物件原型
- c# 通過建構函式及傳入類物件方法引數來複制物件C#函式物件
- Python開發是程式導向、函式還是物件?Python教程Python函式物件
- Python開發是程式導向、函式還是物件?Python基礎!Python函式物件
- js函式,arguments物件JS函式物件
- JS function 是函式也是物件, 淺談原型鏈JSFunction函式物件原型
- js的函式和物件JS函式物件
- 例項物件和函式物件的區別物件函式
- 使用arguments物件獲取函式傳遞的引數物件函式
- JS-陣列、函式、類與物件JS陣列函式物件
- 幽默:男人想談“物件”,女人實際要的是“函式”關係物件函式
- 函式物件、裝飾器、閉包函式函式物件
- javascript生成map物件的函式JavaScript物件函式
- 建構函式建立物件函式物件
- JavaScript 表單、物件、函式JavaScript物件函式
- 物件及函式相關物件函式
- 定義函式物件 (轉)函式物件
- Python函式是所謂的第一類物件(First-Class Object)是什麼鬼?Python函式物件Object
- “函式式”和“物件導向式”在許可權引擎中是如何融為一體的?函式物件
- PHP 函式庫精講之類與物件PHP函式物件
- PHP類和物件函式例項詳解PHP物件函式
- C++中函式指標與函式物件C++函式指標物件
- 物件的生存期 記憶體 深度複製 複製建構函式 筆記物件記憶體函式筆記
- Servlet呼叫構造方法,物件傳不進建構函式中去問題Servlet構造方法物件函式
- 理清原型物件、 例項物件、建構函式原型物件函式
- JS函式,物件,例項方法,物件方法理解JS函式物件
- arguments物件獲取給函式傳遞的實際引數物件函式
- Javascript的函式式和麵向物件特性JavaScript函式物件
- 對JavaScript中函式物件的理解JavaScript函式物件
- 5-函式與物件的方法函式物件
- javascript得知 - js的Date物件函式JavaScriptJS物件函式
- 深入探討JavaScript函式物件JavaScript函式物件
- c++內建函式物件C++函式物件
- QT槽函式獲取訊號傳送物件QT函式物件
- 函式: 函式是怎麼使用的?函式