// Test.cpp : 自定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <memory> //注意加这个头文件 using namespace std; class Widdget { }; int priority() { return 0; } /* 以下的函数可能造成内存泄露: 调用的时候例如以下: processWiddget(std::tr1::shared_p…
问题聚焦:     使用了资源管理对象(如智能指针),就一定是安全的吗?显然不是.     资源泄露发生可能在于,在“资源被创建”和“资源被转换为资源管理对象”两个时间点之间有可能发生异常干扰. 看下面这个例子: //函数说明 int priority(); //揭示处理程序的优先权 void processWidget(std::tr1::shared_ptr<Widget> pw, int priority); // 用来在某动态分配所得的Widget上进行某些带有优先权的处理 // 这里…
  对于函数: int priority(); void processWidget(std::tr1::  shared_ptr<Widget> pw,int priority); 调用以上函数 processWidget(new Widget,priority()); 以上调用错误,因为shared_ptr构造函数需要一个原始指针,但该构造函数是个explicit构造函数,无法进行隐式转换. 而且其调用顺序也无法确定. 所以,我们一般使用分离语句,创建Widget,然后置入只能指针中.最后…
裸指针有着诸多缺点:裸指针的声明中看不出它指向的是单个对象还是数组:裸指针的声明中也无法看出使用完它指向的对象后是否需要删除,也就是声明中看不出裸指针是否拥有其指向的对象:即使知道要析构裸指针指向的对象,也不可能知道如何析构才是恰当的:即使确知要使用delete来析构,也无法判定到底使用delete还是delete[]:使用裸指针也无法保证在程序多个代码路径上仅执行一次析构,不执行析构会造成内存泄漏,多次析构又会产生未定义行为:无法判断出裸指针是否是空悬指针. 智能指针的提出,就是用来解决裸指针…
1. 可能会出现资源泄漏的一种用法 假设我们有一个获取进程优先权的函数,还有一个在动态分类的Widget对象上根据进程优先权进行一些操作的函数: int priority(); void processWidget(std::tr1::shared_ptr<Widget> pw, int priority); 注意这里使用了对象管理资源的用法(Item 13),processWidget为它需要处理的动态分配对象Widget使用了智能指针(tr1::shared_ptr). 现在考虑对proc…
序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目,完全可以利用平时的零碎时间片来阅读和思考.仅仅是阅读了第二章,创建和销毁对象,从静态工厂.构造器等基础得不能再基础的知识,却使我有一种特别的感觉,就如同见到一位会使我怦然心动的女生,那种惊喜,是那么的美妙,却也是那么的震撼.原来女生还能够如此地美,原来书,所谓让人头晕的编程类书籍,可以写得如此地好,直击心灵,…
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用. 由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响. JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9…
请牢记: 以独立语句将newed对象存储于(置入)智能指针内.如果不这样做,一旦异常被跑出来,有可能导致难以察觉的资源泄露. 假设有个函数用来处理程序的优先权,另一个函数用来在某动态分配所得的Widget上进行某些带有优先权的处理: int priority(); //处理程序优先权的函数 void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);//该函数在动态分配所得的Widget上进行某些带有优先权的处理. 调用:…
分享主题:<探讨 Rust 智能指针>| Vol. 17 分享讲师:苏林 分享时间: 周日晚上 2021-11-14 20:30-21:30 腾讯会议地址: https://meeting.tencent.com/dm/mlhs6YsYuFRb 会议 ID: 258 663 900 课程介绍: 指针总是会让人有一些困惑,本周日晚上Rust 培养提高计划一起和你探讨 Rust 的一些智能指针, 如 Box.Cell.RefCell.Rc.Arc.RwLock 和 Mutex .智能指针这个 &q…
条款17 在operator=中检查给自己赋值的情况 1 2 3 class  X { ... }; X a; a = a;  // a 赋值给自己 >赋值给自己make no sense, 但却是合法的; 重要的是, 赋值给自己的情况可以以隐蔽的形式出现: a = b; 如果b是a的另一个名字(初始化为a的引用), 那也是对自己赋值; 这是一个别名的例子: 同一个对象有两个以上的名字; 别名可以以任意形式的伪装出现, 在写函数时一定要考虑到; Note 赋值运算符中要特别注意可能出现别名的情况…