zoukankan      html  css  js  c++  java
  • effective C++ 札记 规定17 在单独的陈述newed对象插入智能指针

    // 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; }


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

  • 相关阅读:
    896. Monotonic Array单调数组
    865. Smallest Subtree with all the Deepest Nodes 有最深节点的最小子树
    489. Robot Room Cleaner扫地机器人
    JavaFX
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4724172.html
Copyright © 2011-2022 走看看