關於在拋異常中我們可能會忘記將記憶體釋放掉造成記憶體洩漏,為了避免這種情況的發生我們引入了智慧型指標,我們把自己申請的記憶體交給這個autoptr類物件去管理,系統會自動呼叫析構函式就能將資源清理防止記憶體洩漏。
template
class autoptr
~autoptr()
}protected:
t* _p;
};void funtest()
}catch (char err)
}int main()
catch (int err)
system("pause");
return
0;}
上述是為了解決忘記釋放記憶體而造成記憶體洩漏的問題,但是關於上面的智慧型指標類存在著許多的問題 。
接下來看看存在哪些問題
void funtest()
無論我們用ap這個物件去構造ap1這個物件還是使用ap這個物件去給ap2賦值程式都會崩潰。
因為你ap這個物件管理了指標變數p所指向的記憶體空間,然後你拷貝構造是預設的是簡單的值拷貝(淺拷貝),因此ap1這個物件也管理了指標變數p所指向的記憶體空間,於是你在析構的時候會因為多次析構同一塊記憶體空間造成程式崩潰,賦值和拷貝構造同理。
為了解決 淺拷貝帶來多次析構同一塊記憶體空間,我們自己定義拷貝建構函式和將賦值運算子過載
template
class autoptr
autoptr(autoptr &ad)//通常拷貝構造都是const型別的但這裡是要修改這個傳入的引數的因此不能是const型別
:_pstr(ad._pstr)//移交管理權
} autoptr& operator =(autoptr &ad)
}~autoptr()
}t& operator*()
t* operator->()
protected:
t* _pstr;
};
但是此時這個智慧型指標仍然存在問題
void funtest()
此時我們對這個ap解引用就會出錯,因為它所指向的記憶體空間已經被置空了,此時是不能去往裡面寫入內容的。
小結一下:這種版本的智慧型指標是極易出錯的,因此不建議使用這種這種智慧型指標,陷進太多,容易造成記憶體洩漏,或者非法的解引用。
auto ptr智慧型指標
1 class auto ptr 這個智慧型指標應該保證,無論在何種情形下,只要自己被摧毀,就一定連帶釋放其所指資源。而由於智慧型指標本身就是區域變數,所以無論是正常退出,還是異常退出,只要函式退出,它就一定會被銷毀。注意 auto ptr不允許使用一般指標慣用的賦值 assign 初始化方式。必須...
智慧型指標 AutoPtr
include include include using namespace std void func autoptr 析構函式來負責釋放 void test catch exception e autoptr 析構函式來負責釋放 private t ptr struct aa void fun...
stl智慧型指標auto ptr
感覺auto ptr還是存在一些不足的,效率十分低,而且丟失了一般指標方便常用的操作,如 等,auto ptr只過載了 這幾個操作符,所以使用很不方便。一 說明 int a null delete a do nothing 應此auto ptr的析構函式是這樣子的 auto ptr 二 auto p...