effective c++ 条款17 :以独立语句将newed 对象置入智能指针

Unity Hololens2开发|(一)环境配置 开发过程中预览和调试应用:可以在电脑上的 Unity 编辑器中以播放模式本地运行应用,并将体验流式传输到 HoloLens2。将来自 HoloLens2 的输入(视线、手势、语音和空间映射)发送到电脑,在其中内容以虚拟沉浸式视图渲染。在HoloLens2设备中,打开Settings面板,依次选择Update & Security > For Developers,打开“Developer Mode”。在开发计算机中打开控制面板,依次选择“更新和安全> 开发者选项”,打开“开发人员模式”; 阅读详情
Store newed objects in smart pointers in standalone statements
      c++编译器会优化你的代码,会根据优先权来选择优先执行哪些代码。C++编译器以什么样的此讯完成这些事情呢?弹性很大。这和其他诸如java,c#不同。她们总是以特定顺序来执行。
// store_new.cpp : 定义控制台应用程序的入口点。

//2011/9/24 by wallwind on sunrise


#include "stdafx.h"

#include <iostream>

#include <memory>

using namespace std;


class Widget

{

public:

    Widget()

    {

        cout<<"Widget()"<<endl;

    }

    ~Widget()

    {

        cout<<"Widget()"<<endl;

    }


};

int priority()

{

    throw new runtime_error("Exception");

    //return 0;

}

void processWidger(auto_ptr<Widget> pw,int priority){}




int _tmain(int argc, _TCHAR* argv[])

{

    processWidger(auto_ptr<Widget>(new Widget()),priority());

    system("pause");


    return 0;

}
Priority函数返回一个执行的优先级, processWidger函数则根据优先级来处理某个类型的对象(许多程序员有时候愿意将某个函数直接做为参数传递进另个函数内)。
1、调用X的构造函数。
2、调用auto_ptr<Widget>的构造函数。
3、调用Priority函数。
看上去井然有序的条件,C++编译器未必会选择这么做。也许编译器选择将调用Priority函数放在第二的位置会生成更高效的代码也说不定。那么顺序就会改为:
1、调用X的构造函数。
2、调用Priority函数。
3、调用auto_ptr<Widget>的构造函数。
那么如果调用Priority函数产生异常怎么办?auto_ptr并没有获得它需要保管的资源,而那段资源也不会遭到释放,有一种资源泄漏的方式。
解决方式就是在外面完成智能指针的存储,编译器对于跨越语句的各项操作不会选择重新排列。这样智能指针依然获得了对所指向资源的保护。

// store_new.cpp : 定义控制台应用程序的入口点。
//2011/9/24 by wallwind on sunrise
#include "stdafx.h"
#include <iostream>
#include <memory>
using namespace std;
class Widget
{
public:
    Widget()
    {
        cout<<"Widget()"<<endl;
    }
    ~Widget()
    {
        cout<<"Widget()"<<endl;
    }
};
int priority()
{
    throw new runtime_error("Exception");
    //return 0;
}
void processWidger(auto_ptr<Widget> pw,int priority){}
int _tmain(int argc, _TCHAR* argv[])
{
    auto_ptr<Widget> pw(new Widget());
    processWidger(pw,priority());
    system("pause");
    return 0;
}


由于编译器对"跨越语句块的各项操作"失去了执行重新排列的自由,所以编译器不能在它们之间任意选择执行顺序.

请记住:
■ 以独立语句将newed对象存储于(置入)智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源
泄露.
【DaVinci Developer工具实战】03 -导入xml文件 本文档描述了 DaVinci Developer 导入数据的的具体功能 ,它适用于导入AUTOSAR SWC 模板【AUTOSAR XML 文件】 文件。 阅读详情

相关推荐

TDISP(TEE Device Interface Security Protocol)软件操作流程

/ 1. SPDM会话相关定义(🔶1-37、🔶1-187)// SPDM会话ID// AES-256-GCM加密密钥(TDISP要求)// 初始向量// 会话是否激活// 2. IDE流配置(🔶1-52、🔶1-625)// IDE流ID// 4个子流的AES密钥(覆盖所有子流类型)// 密钥是否已配置// 3. TDI状态与配置(🔶1-207、🔶1-210)TDI_CONFIG_UNLOCKED = 0, // 初始配置态。

inquisiter 1430

条款17:以独立语句将newed对象置入智能指针

假设我们有个函数用来揭示处理程序的优先权,另一个函数用来动态分配所得的Widget上进行某些带有优先权的处理: int priority(); void processWidget(std::tr1::shared_ptr<Widget> pw, int priority); 现在考虑调用processWidget: processWidget(new Widget,...

IT呵呵哒的博客 232

在Ultralytics YOLO中添加/更换模块详细指南

使用参数继承 my_module_args: &my_args [64, 3, 0.5] # 定义参数模板 backbone: - [-1, 1, MyModule, *my_args] # 引用参数。

MR_Colorful的博客 2583

条款17:以独立的语句将newed对象置入智能指针

本条款的核心思想只有一句话:那就是在使用智能指针管理对象的时候,一定用一条单独的语句将new出来的对象放入智能指针当中去。 下面举个例子说明一下: 假设有如下的代码: class Widget {....}; int priority();//函数1 void processWidget(std::trl::shared_ptr pw, int size);//函数2 //调用函数

IT_iverson的博客 408

【STM32】基于STM32F103C8T6实现步进电机精准调速控制

本文详细介绍了如何使用STM32F103C8T6微控制器实现步进电机的精准调速控制。通过利用其内置定时器生成PWM脉冲,替代低效的延时方法,并结合TB6600驱动器进行硬件连接,可实现平滑、高效的电机速度控制。文章提供了基于HAL库的代码实战,包括速度与方向设置函数,并探讨了加减速规划等高级应用,帮助开发者彻底掌握步进电机驱动技术。

weixin_29169899的博客 485

27、自闭症儿童治疗与玩具设计研究

本研究探讨了自闭症儿童的治疗方法与玩具设计之间的关联,分析了游戏疗法、音乐疗法和职业疗法等在治疗中的应用,并介绍了多种针对自闭症儿童的治疗玩具案例。通过用户研究和多学科合作,提出了以Pro-Ability为核心的设计理念,开发了结合音乐疗法和精细运动训练的智能玩具套件。研究总结了当前成果与局限性,并展望了未来发展方向,旨在为自闭症儿童提供更有效的康复支持。

keras9composer的博客 210

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

Effective C++条款17:以独立语句将newed对象置入智能指针(Store newed objects in smart pointers in standalone statements)

CltCj的博客 930

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

丨汀、的博客 4327

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

深入解析 C++ 中因编译器优化导致的隐式资源泄漏问题,揭示为何必须以独立语句完成 newed 对象到智能指针的转换,提供异常安全的代码实践。

凡人叶枫的博客 189

【华为OD技术面试真题 - 技术面】- 测试面试题(1)

专栏:华为OD面试真题精选 目录: 2024华为OD面试手撕代码真题目录以及八股文真题目录黑盒测试:白盒测试:基本功能验证:边界条件测试:空白输入测试:特殊字符和格式测试:响应时间测试:压力测试:针对在不同系统和设备上测试聊天窗口功能,以及网络正常的前置条件,我们可以增加以下测试用例:系统和设备:PC端测试:移动端测试:功能验证:前置条件:网络性能影响测试:Postman:SoapUI:JMeter:Rest-Assured:Tricentis Tosca:ReadyAPI:CI/CD工具集成:测试管理工

算法大师! 3690

5G射频设计中N77&N79的PRX为什么需要3个SRS

首先,我们来逐个拆解一下这个神秘的“

weixin_43199439的博客 1323

Effective C++条款17:资源管理之(以独立语句将newed对象置入智能指针)

一、演示案例 现在我们有个函数返回处理程序的优先权,然后用另一个函数在某动态分配所得的Widget上进行某些带有优先权的处理 //返回优先权 int priority(); //根据优先权处理对象 void processWidget(std::tr1::shared_ptr<Widget> pw, int priority); 如果我们使用下面的方法调用函数是错误的,因为pr...

董哥的黑板报 898

华为OD技术面八股文_C++_02

汇总华为OD面试C++方面计数八股文真题,提供详细解答。

qq_45776114的博客 765

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

Effective_C++_17

君鼎的博客 608

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Effective C++ 条款17 以独立语句将newed对象置入智能指针

1. 有些智能指针类(比如shared_ptr<T>)不支持隐式类型转换,假设存在这样两个函数: void fun(shared_ptr<int> lhs,int rhs); int foo(); View Code 那么对于以下函数调用: fun(new int,foo()); 将不能通过编译,解决方法之一: fun(sha...

ddzai7557的博客 166

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Effective C++ 学习笔记 条款17 以独立语句将newed对象置入智能指针

可以确定的是“new Widget”一定执行于tr1::shared_ptr构造函数被调用之前,因为这个表达式的结果还要被传递作为tr1::shared_ptr构造函数的一个实参,但对priority的调用则可以排在第一或第二或第三执行。在上述修订后的代码内,“new Widget”表达式以及“对tr1::shared_ptr构造函数的调用”这两个动作,和“对priority的调用”是分隔开来的,位于不同语句内,所以编译器不得在它们之间任意选择执行次序。2.调用tr1::shared_ptr构造函数。

tus00000的博客 432

[Effective C++]条款17:以独立语句将newed对象置入智能指针

C++标准中没有规定函数参数的求值顺序,也就是说,编译器可能会以任意顺序对参数进行求值.

Tim_10的博客 434

Effective C++ 详解条款17:以独立语句将newed对象置入智能指针

在语句内,编译器拥有自由度,容易泄露资源, processwidget (std::tr1::shared_ptr<Widget>(new widget), priority ()) ; 在对processwidget的调用过程中可能引发资源泄漏,因为在“资源被创建(经由“new widget")”和“资源被转换为资源管理对象”两个时间点之间有可能发生异常干扰。 解决办法:使用分离语句。 (1)创建widge; (2)将它置入一个智能指针内,然后再把那个智能指针传给processwidget:

qq_36698189的博客 259

【穿越Effective C++】条款17:以独立语句将newed对象置入智能指针——异常安全的智能指针初始化

这个条款揭示了C++异常安全中一个微妙但危险的陷阱:在复合语句中创建智能指针可能导致资源泄漏。理解这一原则是构建异常安全代码的关键。

沐怡旸的专栏 706

读书笔记《Effective C++》条款17:以独立语句将newed对象置入智能指针

假设我们有两个函数用来揭示处理程序的优先权,另一个函数用来在某动态分配所得的Widget上进行某些带有优先权的处理: int priority(); void processWidget(std::shared_ptr pw, int priority); 由于谨记“以对象管理资源”(条款13),processWidget决定对其动态分配得来的Widget运用智能指针。 现在考虑调用proc

Do-Program的专栏 325

Effective C++条款17——以独立语句将newed 对象置入智能指针(资源管理)

可以确定的是“newwidget”一定执行于tr1::shared ptr构造函数被调用之前,因为这个表达式的结果还要被传递作为tr1::shared_ptr构造函数的一个实参,但对priority的调用则可以排在第---或第二或第三执行。在上述修订后的代码内,"new Widget"表达式以及“对tr1:: shared_ptr构造函数的调用”这两个动作,和“对priority的调用”是分隔开来的,位于不同语句内,所以编译器不得在它们之间任意选择执行次序。等等,不要考虑这个调用形式。

StudyWinter的博客 372

Effective c++条款17 以独立语句将newed 对象置入智能指针

对象管理资源,new出来的是一个指针,需要放到智能指针当中 shared_ptr(类型) pw1:智能指针是一个类,它有自己的构造函数和析构函数,而不是一个指针2:智能指针的构造函数是显示构造函数,不能够进行隐式转换条款17的意思就是 new 对象放到智能指针中要用单独的语句std::str1::shared_ptr&lt;widget&gt;pw(new Widget)如果不用单独的语句proc...

西电流浪者的博客 231

《Effective C++》学习笔记条款17 以独立语句将newed对象置入智能指针

以独立语句将newed对象置入智能指针

UE引擎开发工程师 1155
上一篇: Effective c++ 条款16学习笔记: 成对使用new和delete时要采取相同形式
下一篇: effective c++ 条款18:使接口易于正确使用,而难以错误使用
ctreewang
博客等级 码龄16年 1608粉丝 276原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值