EC筆記:第三局部:17、運用獨立的語句將newed對象放入智能指針。本站提示廣大學習愛好者:(EC筆記:第三局部:17、運用獨立的語句將newed對象放入智能指針)文章只能為提供參考,不一定能成為您想要的結果。以下是EC筆記:第三局部:17、運用獨立的語句將newed對象放入智能指針正文
普通的智能指針都是經過一個普通指針來初始化,所以很容易寫出以下的代碼:
#include <iostream>
using namespace std;
int func1(){
//前往一個整數的函數
}
void func2(AutoPtr<int*> ptr,int t){
//一些操作
}
int main(){
func2(AutoPtr<int*>(new int(5)),func1());
//其他操作
}
乍一看,這段代碼仿佛沒有什麼問題,但實則隱藏隱患。
我們在調用func2的時分,外面的參數是需求運算的,運算一共有三步:
我們知道,1一定在2後面調用,但是3的調用順序就不一定了.
我們假定一種狀況:調用順序為1->3->2
假定我們在調用3的時分,拋出了一個異常,這時分1曾經調用終了,也就是說,內存曾經分配了,但是沒有成功的放入智能指針中。這塊內存不會被自動釋放。於是引發了內存走漏。
為了防止這個狀況,我們可以將該進程分為兩步:
#include <iostream>
using namespace std;
int func1(){
//前往一個整數的函數
}
void func2(AutoPtr<int*> ptr,int t){
//一些操作
}
int main(){
AutoPtr<int*> param(new int(5));
func2(param,func1());
//其他操作
}
只需確保智能指針的初始化不被打斷,該隱患自然就會解除。
即便func1拋出異常,此時,智能指針曾經初始化終了,可以在析構函數中釋放掉管理的內存。