*返回一个整数的函数金沙网址:

EC笔记:第三有的:17、使用独立的言辞将newed对象放入智能指针,ecnewed

相似的智能指针都是通过贰个常见指针来开头化,所以很轻巧写出以下的代码:

#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抛出特别,此时,智能指针已经初阶化完结,能够在析构函数中自由掉管理的内部存储器。

一般的智能指针都以经过多个普普通通指针来开始化,所以很轻巧写出…

相关文章