More Effective C++ 读书摘要(三、异常)Item9 - 15

Python实战:逐笔高频因子构建与回测全流程解析 本文详细解析了使用Python构建与回测逐笔高频因子的全流程。从逐笔数据的价值与清洗入手,通过实战代码演示了‘大买成交金额占比’因子的计算逻辑,并重点阐述了因子正交化处理的重要性以剔除风格影响。最后,提供了一个经典的分位数回测框架来验证因子有效性,并分享了数据质量、计算效率与过拟合等核心避坑指南。 阅读详情

为什么一定要使用异常?答案很简单:异常不能被忽略。


Item9.使用析构函数防止资源泄漏:
通过智能指针auto_prt将清除代码放入其析构函数里。核心部分如下:

(因为auto_ptr的析构函数使用的是用于删除单个对象的delete,所以它不能用于指向对象数组的指针。这时个用vector代替array可能是更好的选择。)

auto_ptr背后的思想可以用于所有防止在异常被抛出时动态分配的资源泄漏问题,如下面的GUI程序:


Item10. 防止构造函数里的资源泄漏
C++只销毁构造完全的对象,即其构造函数被完全执行的对象。所以如果构造函数运行的过程中抛出了一个异常,那对象的析构函数将不会被调用。
先看非静态成员:

但是如果让theImage和theAudioClip都成为常量指针:

则只能通过成员初始化列表对其进行初始化。于是不能再在构造函数中使用try, catch块来解决这个问题了。
这时可使用auto_ptr来帮忙:

现在的初始化形式为:

小结:如果把那些声明为指针的类成员替换成它们相应的auto_ptr对象(thy:在Effective C++ 3rd中已经进一步建议用std::tr1::shared_ptr),在发生异常的时候构造函数就可以避免资源泄漏,而且免去了在析构函数中手工释放资源的必要。使用它们不仅使程序让人更容易理解,而且使程序在发生异常的时候更为健壮。


Item11. 阻止异常传递到析构函数以外:
阻止异常传递到析构函数以外以两个很好的理由。首先,在异常传递进行到堆栈解开(stack-unwinding)的过程中,防止terminate被调用,从而防止程序被当掉。第二它能帮助确保析构函数总能完成我们希望它做的所有事情,比如后面可能的endTransaction。

表面上看catch块什么也没做,但它阻止了logDestruction抛出的异常传递到Session的析构函数外面。


 

Item12. 理解抛出异常与传递参数或者调用虚函数之间的不同:
一、传递方式不同

①你调用函数时,程序的控制权最终还会返回到函数的调用处(除非函数没有正常返回),但是当你抛出一个异常时,控制权永远不会回到抛出异常的地方。所以不论通过传值捕获异常还是通过引用捕获(不能通过指针捕获这个异常,因为类型不匹配)都将进行拷贝操作,也就说传递到catch子句中的是一份拷贝。

当异常对象被拷贝时,拷贝操作是由对象的拷贝构造函数完成的。该拷贝构造函数是对象的静态类型(static type)所对应类的拷贝构造函数,而不是对象的动态类型(dynamic type)对应类的拷贝构造函数。即不再有多态性:

②比较下面两个catch块:

这两个catch块的差别在于第一个catch块中重新抛出的是当前捕获的异常,而第二个catch块中重新抛出的是当前捕获异常的一个新的拷贝。第一个块中重新抛出的是当前异常(current exception),无论它是什么类型。特别是如果这个异常开始就是做为SpecialWidget类型抛出的,那么第一个块中传递出去的还是SpecialWidget异常,即使w的静态类型(static type)是Widget。这是因为重新抛出异常时没有进行拷贝操作。第二个catch块重新抛出的是新异常,类型总是Widget,因为w的静态类型(static type)是Widget。所以一般情况下应该使用throw;效率也更高。

 

③比较下面三个catch块:
catch (Widget w) ...                //通过传值捕获异常,会两次创建被抛出对象的拷贝
catch (Widget& w) ...              //通过传递引用捕获,会一次创建被抛出对象的拷贝
catch (const Widget& w) ...     //通过传递指向const的引用,会一次创建被抛出对象的拷贝

 

通过指针抛出异常与通过指针传递参数是相同的。不论哪种方法都是一个指针的拷贝被传递。只要记住不要抛出一个指向局部对象的指针,因为当异常离开局部变量的生存空间时,该局部变量已经被释放。Catch子句将获得一个指向已经不存在的对象的指针。

 

二、类型匹配的过程不同
如标准库中double sqrt(double);                 // from <cmath> or <math.h>
我们能这样计算一个整数的平方根,如下所示:
int i;
double sqrtOfi = sqrt(i);
但如下的try...catch却不能如你相像地工作:

不过在catch子句中进行异常匹配时可以进行两种类型转换。第一种是继承类与基类间的转换。一个用来捕获基类的catch子句也可以处理派生类类型的异常:
catch (runtime_error) ...                       // can catch errors of type
catch (runtime_error&) ...                    // runtime_error,
catch (const runtime_error&) ...          // range_error, or
                                                           // overflow_error
                                       
catch (runtime_error*) ...                   // can catch errors of type
catch (const runtime_error*) ...         // runtime_error*,
                                                          // range_error*, or
                                                          // overflow_error*

(range_error和overflow_error继承自runtime_error,而runtime_error又继承自exception)
第二种是允许从一个类型化指针(typed pointer)转变成无类型指针(untyped pointer),所以带有const void* 指针的catch子句能捕获任何类型的指针类型异常:

catch (const void*) ...                 //捕获任何指针类型异常


三、处理哲学不同
异常处理的策略是”最先匹配first fit“,而虚函数是”最优匹配best fit“(被调用的函数是属于离调用此函数的对象的动态类型最相近的类的)。
             
(invalid_argument继承自logic_error)         
因此:不要把处理基类异常的catch子句放在处理派生类异常的catch子句的前面。


Item13.通过引用捕获异常:
捕获异常有三种方式:
①通过指针(by pointer)

在理论上这种方法的实现对于这个过程来说是效率最高的。因为在传递异常信息时,只有采用通过指针抛出异常的方法才能够做到不拷贝对象

但为了能让程序正常运行,程序员定义异常对象时必须确保当程序控制权离开抛出指针的函数后,对象还能够继续生存,即全局与静态对象。
另一种抛出指针的方法是在建立一个堆对象(new heap object),但这会引发另一个问题:没办法知道异常对象该不该删除。通过指针捕获异常也不符合C++语言本身的规范。四个标准的异常――bad_alloc,bad_cast,bad_typeid和bad_exception都不是指向对象的指针,所以你必须通过值或引用来捕获它们。

 

②通过传值(by value)
可以消除①所带来的问题,但是当它们被抛出时系统将对异常对象拷贝两次。而且它会产生slicing problem,即派生类的异常对象被做为基类异常对象捕获时,那它的派生类行为就被切掉了(sliced off)。这样的sliced对象实际上是一个基类对象:它们没有派生类的数据成员,而且当调用它们的虚拟函数时,系统解析后调用的是基类对象的函数。

③通过引用(by reference)
通过引用捕获异常能使你避开上述所有问题。不象通过指针捕获异常,这种方法不会有对象删除的问题而且也能捕获标准异常类型。也不象通过值捕获异常,这种方法没有slicing problem,而且异常对象只被拷贝一次。


Item14. 审慎地使用异常规格:
注:异常规格即指定可能抛出的异常类型
编译器在编译时有时能够检测到异常规格的不一致。而且如果一个函数抛出一个不在异常规格范围里的异常,系统在运行时能够检测出这个错误,然后一个特殊函数unexpected将被自动地调用。

 

函数unexpected缺省的行为是调用函数terminate,而terminate缺省的行为是调用函数abort,所以一个违反异常规格的程序其缺省的行为就是halt(停止运行)。在激活的stack frame中的局部变量没有被释放,因为abort在关闭程序时不进行这样的清除操作。对异常规格的触犯变成了一场并不应该发生的灾难。

 

例如:函数f1没有声明异常规格,这样的函数就可以抛出任意种类的异常:
extern void f1();                  // 可以抛出任意的异常
假设有一个函数f2通过它的异常规格来声明其只能抛出int类型的异常:
void f2() throw(int);
f2调用f1是非常合法的,即使f1可能抛出一个违反f2异常规格的异常:

最终会导致程序的终结。(thy:在VC2005下实验未被终结)
①一种好的避免调用unexpected函数的方法是避免在带有类型参数的模板内使用异常规格。

这个模板包含的异常规格表示模板生成的函数不能抛出异常。但是事实可能不会这样,因为opertor&能被一些类型对象重载。如果被重载的话,当调用从operator==函数内部调用opertor&时,opertor&可能会抛出一个异常,这样就违反了我们的异常规格,使得程序控制跳转到unexpected。
几乎不可能为一个模板提供一个有意义的异常规格,因为模板总是采用不同的方法使用类型参数。解决方法只能是模板和异常规格不要混合使用。

 

②能够避免调用unexpected函数的第二个方法是如果在一个函数内调用其它没有异常规格的函数时应该去除这个函数的异常规格。但是实际中容易被忽略,比如允许用户注册一个回调函数:

如果在makeCallBack内部使用了回调函数func,则无法知道func会抛出什么类型的异常。
解决方案是在CallBackPtr typedef中采用更严格的异常规格:

 

③避免调用unexpected的第三个方法是处理系统本身抛出的异常。这些异常中最常见的是bad_alloc,当内存分配失败时它被operator new 和operator new[]抛出。如果你在函数里使用new操作符,你必须为函数可能遇到bad_alloc异常作好准备。

也就是说有时直接处理unexpected异常比防止它们被抛出要简单。例如你正在编写一个软件,精确地使用了异常规格,但是你必须从没有使用异常规格的程序库中调用函数,要防止抛出unexpected异常是不现实的,因为这需要改变程序库中的代码。


★虽然防止抛出unexpected异常是不现实的,但是C++允许你用其它不同的异常类型替换unexpected异常,你能够利用这个特性。例如你希望所有的unexpected异常都被替换为UnexpectedException对象。你能这样编写代码:

通过用convertUnexpected函数替换缺省的unexpected函数,来使上述代码开始运行。:
set_unexpected(convertUnexpected);
当你这么做了以后,一个unexpected异常将触发调用convertUnexpected函数。Unexpected异常被一种UnexpectedException新异常类型替换。如果被违反的异常规格包含UnexpectedException异常,那么异常传递将继续下去,好像异常规格总是得到满足。(如果异常规格没有包含UnexpectedException,terminate将被调用,就好像你没有替换unexpected一样)


另一种把unexpected异常转变成已知类型的方法是替换unexpected函数,让其重新抛出当前异常,这个新抛出的异常将被替换为标准类型的bad_exception。

如果这么做,你应该在所有的异常规格里包含bad_exception(或它的基类,标准类exception)。你将不必再担心如果遇到unexpected异常会导致程序运行终止。任何不听话的异常都将被替换为bad_exception,这个异常代替原来的异常继续传递。
异常规格还有一个缺点就是即使一个high-level调用者准备处理被抛出的异常,它们仍然能导致unexpected被触发,比如:

异常规格throw()使得只要logDestruction抛出异常就和异常规格矛盾,程序被终止。(除非如前替换unexpected函数)

 


 

Item15. 理解异常处理所付出的代价:
三大开销分别为①为了在运行时处理异常,程序要记录大量的信息。即使你没有使用try,throw或catch关键字,你同样得付出一些代价。
②来自于try块,这还是假设程序没有抛出异常,这里讨论的只是在程序里使用try块的开销。③编译器为异常规格生成的代码与它们为try块生成的代码一样多,所以一个异常规格一般花掉与tyr块一样多的系统开销。

现在我们来到了问题的核心部分,看看抛出异常的开销。事实上我们不用太关心这个问题,因为异常是很少见的。80-20规则告诉我们这样的事件不会对整个程序的性能造成太大的影响。与一个正常的函数返回相比,通过抛出异常从函数里返回可能会慢三个数量级。这个开销很大。但是仅仅当你抛出异常时才会有这个开销,一般不会发生。但是如果你用异常表示一个比较普遍的状况,例如完成对数据结构的遍历或结束一个循环,那你必须重新予以考虑。

 

所以:只要可能尽量就采用不支持异常的方法编译程序,把使用try块和异常规格限制在你确实需要它们的地方,并且只有在确为异常的情况下(exceptional)才抛出异常。如果你在性能上仍旧有问题,总体评估一下你的软件以决定异常支持是否是一个起作用的因素。

【AUTOSAR AP PHM 】PHM 标准化“检查点上报接口”落地指南(AUTOSAR AP · R24-11取向) 本文介绍了AUTOSAR AP R24-11标准下PHM(平台健康管理)模块中"检查点上报接口"的标准化实现方案。主要内容包括: 核心设计理念:采用"配置优先"原则,通过部署模型预先定义监管参数,应用进程只需简单上报枚举标识,具体判定由PHM执行。 职责划分: 应用进程:仅调用ReportCheckpoint接口上报枚举值 PHM:负责Alive计数、Deadline区间判定和Logical路径校验 EM/IdsM:提供进程状态和越权检测 三类监管机制: Alive: 阅读详情

相关推荐

微信小程序后台定位与实时位置更新的实战指南

本文提供了微信小程序实现后台定位与实时位置更新的完整实战指南。针对小程序退到后台后位置更新中断的痛点,详细解析了基于`startLocationUpdateBackground`API的后台定位解决方案。内容涵盖从隐私协议配置、项目权限声明,到授权、启动、监听、停止的核心代码流程,并分享了真机调试、性能优化及权限引导等关键避坑经验,帮助开发者构建稳定可靠的后台位置服务。

weixin_29008055的博客 473

《More Effective C++》 读书笔记(一)

一、基础议题Item 1. 区分指针和引用指针是整数,代表的是内存地址,通过*操作符访问该内存地址上的值而引用是一个变量的别名,可以有空指针,没有空引用引用使用之前不需要判空,因为没有所谓的空引用但是指针使用之前通常得判空引用永远指向它最初获得的那个对象应该总是令operator []返回referenceItem 2. 优先考虑C++风格的类型转换(type)expression这样的类型转换是...

I feel lost 344

Pico设备手势追踪实战:5步搞定MRTK3手部模型与UI交互配置

本文详细介绍了在Pico设备上使用MRTK3实现手势追踪的5个关键步骤,包括环境配置、手部模型冲突解决、射线交互优化、UI交互配置及性能优化。通过实战案例和代码示例,帮助开发者快速解决MR开发中的常见问题,提升混合现实应用的交互体验。

onion的博客 499

More Effective C++之 Item M9:使用析构函数防止资源泄漏

对指针说再见。必须得承认:你永远都不会喜欢使用指针。 Ok,你不用对所有的指针说再见,但是你需要对用来操纵局部资源(local resources)的指针说再见。假设,你正在为一个小动物收容所编写软件,小动物收容所是一个帮助小狗小猫寻找主人的组织。每天收容所建立一个文件,包含当天它所管理的收容动物的资料信息,你的工作是写一个程序读出这些文件然后对每个收容动物进行适当的处理(approp...

janeqi1987的专栏 240

机场数据治理系列介绍(1):机场行业数据中台中的数据管理顶层设计方案

民航机场行业的数据中台中,有关数据管理顶层设计方案需要结合机场行业的业务特点和技术需求进行具体的设计,今日我们简要考量设计提供一个参考方案:

机场信息系统研究员的专栏 1605

ANSYS材料库实战:手把手教你用APDL命令流定义混凝土和形状记忆合金

本文详细介绍了在ANSYS中使用APDL命令流定义混凝土和形状记忆合金(SMA)的高级建模技巧。通过SOLID65单元和SMA本构模型,工程师可以精确模拟非线性材料行为,包括混凝土的开裂和SMA的超弹性效应。文章提供了完整的命令流示例和求解策略优化建议,帮助用户提升工程仿真效率。

hh234的博客 486

Effective C++ 读书笔记 Item8 析构函数不能抛出异常

构造函数可以抛出异常。 C++标准指明析构函数不能、也不应该抛出异常。 在步入正题前,我们先来讲讲什么叫栈展开(stack unwinding),才能更好理解C++异常(exception)的机制是怎样运作的: void f1() throw(int){ //函数f1会抛出一个整型的异常代码 cout<<"f1 starts"<<endl;...

Vermont_的博客 258

CXL协议-第三章 CXL事务层

CXL.io为I/O设备提供了一个非一致的负载/存储接口。图3-1显示了Flex总线分层层次结构中的位置。事务类型、事务分组格式、基于信用的流量控制、虚拟通道管理和事务排序规则遵循PCIe*定义,详情请参考PCIe基础规范的“事务层规范”章节。本章重点介绍了用于CXL.io的著名的PCIe操作模式或特性。

qq_41305217的博客 2769

读书笔记 effective c++ Item 8 不要让异常(exceptions)离开析构函数

1.为什么c++不喜欢析构函数抛出异常 C++并没有禁止析构函数出现异常,但是它肯定不鼓励这么做。这是有原因的,考虑下面的代码: 1 class Widget { 2 3 public: 4 5 ... 6 7 ~Widget() { ... } // assume this might emit an exception 8 9 }; 10

wwqwkg6e的专栏 251

Vue和Vue-Element-Admin(六):集成中的CORS(跨域资源共享)问题

在vue-element-admin登录集成时候碰到跨域资源共享问题,CORS(Cross-origin resource sharing)是浏览器的技术规范,浏览器可以发起跨域请求但Javascript脚本不能,传统的ajax只能获取在同域名下的资源,但Html5允许ajax发起跨域请求,解决方案有:JSONP、Flash、IFrame、CORS。 一、CORS(跨域资源共享)问题 针对vue-element-admin的登录模块的后端接口完成后,前端调用时候出现报错,因为前端的端口是9527而后.

叶子叶来 9615

基于FMU的Star CCM+与Amesim复杂控制联合分析

基于FMU的Star CCM+与Amesim复杂控制联合分析

2201_75375391的博客 2017

Effective C++读书笔记——item8(析构函数与异常)

类对象)过程中连续抛出异常,出现两个或多个活动异常时,程序可能会终止或者出现未定义行为,使用其他标准库容器、TR1 中的容器甚至数组等情况都可能引发同样问题,即便不涉及容器和数组,析构函数引发异常也可能导致程序过早终止或出现未定义行为。可能抛出异常),当异常抛出后,析构函数传播该异常会带来麻烦,因为这相当于把棘手问题抛出去了,不符合析构函数的特性。等容器包含对象为例,当容器析构时要析构其中元素,若在析构元素(如。:C++ 虽未禁止在析构函数中引发异常,但坚决阻止这样做。

weixin_46032775的博客 777

内部函数方式获取工序包容盒(最低点和最高点)PTHDSP_ask_box

内部函数方式获取工序包容盒(最低点和最高点)PTHDSP_ask_box。

成长需要沉淀。 397

Effective C++ 读书笔记 Item29 追求异常安全的代码

考虑下面例子,有一个菜单类, changeBg 函数可以改变它的背景,切换背景计数,同时提供线程安全: class Menu{ Mutex mutex; //提供多线程互斥访问 Image *bg; //背景图片 int changeCount; //切换背景计数 public : void changeBg(istream& sr); }; ...

Vermont_的博客 261

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

More Effective C++ 读书摘要(六、杂项)Item32 - 35

Item32. 在将来时态下开发程序: 作为软件开发人员,我们也许知道得不够多,但我们知道万物都会变化。我们没必要知道什么将发生变化,这么变化又怎么发生,以什么时候发生,在哪里发生,但我们知道:万物总会变化。 好的软件能够适应变化。它提供新的特性,适应到新的平台,满足新的需求,处理新的输入。这种软件的灵活性、健壮性、可靠性不是来自于运气。它是那些遵照了现在的要求并关注了将来可能的开

thy专栏 914

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《Effective C++》读书笔记之item29:为“异常安全”而努力是值得的

1.“异常安全性”(exception safety)能够为函数带来两个好处: 不泄漏任何资源;不允许数据败坏:操作未正确完成却已经改变了部分数据。 以这样的思想设计的函数(异常安全性函数)提供以下三个保证,即具有三个安全性等级: 基本承诺:如果抛出异常,程序内的任何事物仍然保持在有效状态下,没有任何对象或数据结构会因此而败坏,所有对象都处于一种内部前后一致的状态。但程序的现实状态不

banguijun的专栏 870

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

More Effective C++读书笔记---异常

异常如果你需要一个方法,能够通知不可被忽略的异常状态,并且搜索栈空间以便找到异常处理代码时,你还得确保局部对象的析构函数必须被调用,这时你就需要使用C++的异常处理九、条款9--使用析构函数防止资源泄漏1.ALA* pa = readALA( dataResource );pa->processAdoption();delete pa;如果processAdoption()抛出异常,process

DotScylla 864

读书笔记 effective c++ Item 13 用对象来管理资源

正文 回到顶部 1.不要手动释放从函数返回的堆资源 假设你正在处理一个模拟Investment的程序库,不同的Investmetn类型从Investment基类继承而来, 1 class Investment { ... }; // root class of hierarchy of 2 3 // investment types 进一步假设这个程序库通过一个工厂函数(I

tmchongye的专栏 3099

Effective C++读书笔记——item11(自赋值)

在编写代码时要确保operator=等操作多个对象的函数在对象自赋值或对象相同时行为良好,处理自赋值问题的技巧包括比较源和目标对象地址、关注语句顺序、使用 “copy and swap” 等方法,并且要根据实际情况权衡效率、代码清晰度等因素来选择合适的方式。

weixin_46032775的博客 938

Item 8:别让异常逃离析构函数【effective C++读书笔记】

不要让异常出现在析构函数里,如果是析构函数中调用的函数导致的异常,应在析构函数中对异常作出处理(try,catch),吞下异常(不传播)或结束程序。举例中close()是需要调用的函数。                                              ①  如果程序遭遇一个“于析构期间发生的错误”后无法继续执行,“强迫结束程序”是个合理选项,毕竟它可以阻止异常从析构

花花世界 418

Effective C++学习笔记(Part Five:Item 26-31)

最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力。最近会把最近的读书心得与读书笔记记于此,必备查找使用,如果总结有什么不 当之处,欢迎批评指正: 现在只列出框架,最近会尽快填充完整: 第5部分:实现(Implementations) 本部分主要讲述了类实现过程中的一些原则,为设计出高效率的实现方式,这是你的必经之路;在这一部分读的比较仔

海将军 531

读书笔记 effective c++ Item 11 在operator=中处理自我赋值

1.自我赋值是如何发生的 当一个对象委派给自己的时候,自我赋值就会发生: 1 class Widget { ... }; 2 3 Widget w; 4 5 ... 6 7 w = w; // assignment to self、 这看上去是愚蠢的,但这是合法的,所以请放心,客户端是可以这么做的。此外,自身赋值也并不总是很容易的能够被辨别出来。举个例子: 1

c2iekqea的专栏 305

Effective C++ 读书笔记 Item19 把类的设计看作类型的设计

在C++和其它面向对象的语言中,定义一个类就定义了一个新的类型。重载函数和操作符,内存的分配与释放,对象的构造与析构,全部掌握在你的手上。所以在设计类的时候,要像语言的设计者设计原始类型一样小心。 好的类型拥有自然的语法,直观的语义和高效率的实现。如何高效地设计一个类呢? 以下的问题在几乎所有的类型设计中都会遇到,以及考虑这些问题会如何影响到你的设计: 新类型的对象要如何创建和销毁? "How...

Vermont_的博客 220

More Effective C++ 读书摘要(五、技巧2)Item28 - 29

Item28. 智能(smart)指针:当你使用智能指针替代C++的内建指针(dumb pointer),你就能控制下面这些方面的指针的行为:构造和析构(Construction and destruction)、拷贝和赋值(Copying and assignment)、解引用(Dereferencing)大多数智能指针模板看起来都象这样: template

thy专栏 1012

Effective C++ 读书笔记 Item51 new和delete时请遵循惯例

Item 50介绍了如何自定义new和delete但没有解释你必须遵循的惯例, 这些惯例中有些并不直观,所以你需要记住它们! operator new需要无限循环地获取资源,如果没能获取则调用”new handler”,不存在”new handler”时应该抛出异常; operator new应该处理size == 0的情况; operator delete应该兼容空指针; operato...

Vermont_的博客 302
上一篇: 《Beginning Python From Novice to Professional》学习笔记三:List
下一篇: More Effective C++ 读书摘要(四、效率)Item16 - 24
thy38
博客等级 码龄19年 184粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值