// Test.cpp : 自定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <memory> //注意加这个头文件
using namespace std; class Widdget
{
}; int priority()
{
return 0;
}
/*
以下的函数可能造成内存泄露:
调用的时候例如以下: processWiddget(std::tr1::shared_ptr<Widdget>(new Widdget), priority());
这里的 std::tr1::shared_ptr<Widdget>(new Widdget)由两部分组成
1:运行new Widdget表达式
2:调用tr1::shared_ptr构造函数
再加上priority()函数,在调用processWiddget()之前。编译器必须创建代码,做一下三件事情:
调用priority()函数
运行“new Widdget”
调用tr1::shared_ptr构造函数
C++编译器对这三个调用顺序不是固定的,能够确定的是new Widdget一定运行于tr1::shared_ptr构造函数之前,由于
new Widdget的结果要作为构造函数的一个參数,可是对于priority的调用排在哪个顺序就不知道了
可能是:
1:new Widdget
2:调用priority()
3:调用tr1::shared_ptr构造函数
这里假设priority调用出现了异常没那么new Widdget的指针将会遗失掉, 造成资源泄露。 解决的方法非常easy:
使用分离语句:
(1):创建Widdget
(2):讲它置入一个智能指针内。然后再调用processWiddget
std::tr1::shared_ptr<Widdget> pw(new Widdget);//单独语句内以智能指针存储newed所得对象
processWiddget(pw,priority()) 以独立语句将newed对象存储于智能指针,假设不这样做,一旦发生异常可能导致内存泄露
在VC6.0中不能使用tr1::shared_ptr */ void processWiddget(std::tr1::shared_ptr<Widdget> pw, int priority())
{ } int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

effective C++ 札记 规定17 在单独的陈述newed对象插入智能指针的更多相关文章

  1. Effective C++(17) 以独立语句将newed对象置入智能指针

    问题聚焦:     使用了资源管理对象(如智能指针),就一定是安全的吗?显然不是.     资源泄露发生可能在于,在“资源被创建”和“资源被转换为资源管理对象”两个时间点之间有可能发生异常干扰. 看下 ...

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

      对于函数: int priority(); void processWidget(std::tr1::  shared_ptr<Widget> pw,int priority); 调用 ...

  3. Effective Modern C++:04智能指针

    裸指针有着诸多缺点:裸指针的声明中看不出它指向的是单个对象还是数组:裸指针的声明中也无法看出使用完它指向的对象后是否需要删除,也就是声明中看不出裸指针是否拥有其指向的对象:即使知道要析构裸指针指向的对 ...

  4. 读书笔记 effective c++ Item 17 使用单独语句将new出来的对象放入智能指针

    1. 可能会出现资源泄漏的一种用法 假设我们有一个获取进程优先权的函数,还有一个在动态分类的Widget对象上根据进程优先权进行一些操作的函数: int priority(); void proces ...

  5. effective java读书小记(一)创建和销毁对象

    序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...

  6. javaweb基础(17)_jsp九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

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

    请牢记: 以独立语句将newed对象存储于(置入)智能指针内.如果不这样做,一旦异常被跑出来,有可能导致难以察觉的资源泄露. 假设有个函数用来处理程序的优先权,另一个函数用来在某动态分配所得的Widg ...

  8. 探讨 Rust 智能指针 | Vol.17

    分享主题:<探讨 Rust 智能指针>| Vol. 17 分享讲师:苏林 分享时间: 周日晚上 2021-11-14 20:30-21:30 腾讯会议地址: https://meeting ...

  9. Effective C++ 第二版 17)operator=检查自己 18)接口完整 19)成员和友元函数

    条款17 在operator=中检查给自己赋值的情况 1 2 3 class  X { ... }; X a; a = a;  // a 赋值给自己 >赋值给自己make no sense, 但 ...

随机推荐

  1. 第十二章——SQLServer统计信息(3)——发现过期统计信息并处理

    原文:第十二章--SQLServer统计信息(3)--发现过期统计信息并处理 前言: 统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要 ...

  2. RH253读书笔记(3)-Lab 3 Securing Networking

    Lab 3 Securing Networking Goal: To build skills with the Netfilter packet filter Sequence 1: Applyin ...

  3. 本文摘录 - Infobright

    背景 论文 Brighthouse: AnAnalytic Data Warehouse for Ad-hoc Queries.VLDB 2008 brighthouse它是一个面向列的数据仓库.在数 ...

  4. 模拟Vue之数据驱动3

    一.前言 在"模拟Vue之数据驱动2"中,我们实现了个Observer构造函数,通过它可以达到监听已有数据data中的所有属性. 但,倘若我们想在某个对象中,新增某个属性呢? 如下 ...

  5. Team Foundation Server 2015使用教程--tfs用户账号切换

  6. iOS coreData

    static int row=0; static const NSString *kStoryboardName = @"LRCoreDataViewController"; st ...

  7. python基础课程_学习笔记13:标准库:有些收藏夹——sys

    标准库:有些收藏夹 sys sys这个模块可以让你访问和python解释器联系紧密的变量和函数. sys模块中一些重要的函数和变量 函数/变量 描写叙述 argv 命令行參数,包含脚本名称 exit( ...

  8. (二)给IE6-IE9中的input添加HTML5新属性-placeholder

    同样是最近遇到的一个小问题.因为IE9以下input是不支持placeholder属性的.在网上找到了解决方案,果断带走.正如鲁迅先生所说的‘拿来主义’:运用脑髓,放出眼光,自己来拿!感谢.借花献佛在 ...

  9. windows(64位)下用vagrant+virtualbox 管理虚拟机具体解释

    windows下安装(64位) vagrant 跟 vituriebox http://blog.smdcn.net/article/1308.html Host: 127.0.0.1 Port: 2 ...

  10. 一个MP3播放的插件jPlayer

    Jplayer小样   最近应公司要求需要一个MP3播放的插件,网上找了很多插件,看来看去还是jPlayer用着最舒服也最容易扩展.所以就找了个资料研究了下,简单做了个小DEMO.支持实时控制列表,常 ...