程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> EC筆記:第三局部:17、運用獨立的語句將newed對象放入智能指針

EC筆記:第三局部:17、運用獨立的語句將newed對象放入智能指針

編輯:關於C++

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. int *t=new int(5);// 假定兩頭變量為t
  2. AutoPtr<int*> param(t);// 假定兩頭變量為param
  3. func1();

我們知道,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拋出異常,此時,智能指針曾經初始化終了,可以在析構函數中釋放掉管理的內存。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved