Effective C++ 规则17:以独立语句将newed对象置入智能指针

博客讨论了在C++中使用`std::shared_ptr`时可能出现的内存泄漏问题。当尝试在构造智能指针的同时调用可能抛出异常的函数时,如果异常在智能指针创建之前发生,会导致内存未被正确管理。解决方法是将智能指针的构造和函数调用分开,确保对象在智能指针管理范围内再执行可能抛出异常的操作。
摘要由CSDN通过智能技术生成

        假设有如下两个函数:

        int priority();

        void processWidget(std::shared_ptr<Widget> pw, int priority);

        将Widget视为资源,我们在调用processWidget是如下调用是不行的processWidget(new Widget, priority())。这样会编译报错,原因很简单,因为把一个指针传递给了一个对象,而这个对象内部没有隐式转换函数。

        那么下面这种调用方式是否可以呢?

        processWidget(std::shared_ptr<Widget>(new Widget), priority());

        从语法的角度是没有问题的,但是C++编译器在编译processWidget函数体前,会执行三步操作,1)new一个Widget对象  2)调用share_ptr类的构造函数 3)调用priority函数。C++编译器不像java和C#编译器那样可以对这几步操作确定顺序,C++编译器有可能会进行优化,当调用priority函数的执行顺序在第二步的时候,就有可能发生内存泄漏问题。因为在执行priority的时候可能发生异常,一旦发生了异常,new出来的指针就不能被放到智能指针对象内,达不到想要的目的。

        解决办法也很简单,代码如下:

        std::shared_ptr<Widget> pw(new Widget);//将这个语句单独出来

        processWidget(pw, priority());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值