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


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

  • 相关阅读:
    youku客户端
    youku服务端
    [计算机网络]从页面输入网址,回车到显示内容,这中间到底经历了什么
    [碎碎念]在嘛,吱一声.吱...
    [数据结构与算法]08 队列( Queue )以及队列实现的三种方式( Java 版)
    过年了,随便说点儿啥
    [碎碎念]为什么要写易维护的代码
    [碎碎念]如何成为更好的自己
    [年终总结]愿你在以后的黑暗时刻,都能想起我
    [数据结构与算法]07 关于单链表环的操作( Java 版)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4724172.html
Copyright © 2020-2023  润新知