Effective C++ 条款17

以独立语句将newed对象置入智能指针

本节我们须要学习的知识核心是注意编译器在同一语句中,调用次序具有不确定性,不同语句中,调用次序确定。

上面的话什么意思?

请看下面代码:

int priority();
int processWidget(shared_ptr<Widget> pw, int priority);
processWidget(shared_prt<Widget> pw(new Widget), priority());

以上代码运行三个行为,各自是

1、运行priority()函数

2、运行new Widget

3、运行shared_ptr构造函数

大家知道这三个行为顺序吗?

我想没人敢非常自信的说顺序是什么,由于编译器在运行时,对以上三个行为的运行次序是不确定的。唯一确定的次序就是2行为在3行为之后。

假设,运行次序是2、1、3.那么当函数priority()调用出现异常。new Widget返回的指针还没来得及放入shared_ptr中。这样会造成内存泄露。

所以,我们在编程的时候,最好将紧密行为单独编写为单一语句。

例如以下:

shared_prt<Widget> pw(new Widget);
processWidget(pw,priority());
时间: 2024-10-16 02:35:39

Effective C++ 条款17的相关文章

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

  对于函数: int priority(); void processWidget(std::tr1::  shared_ptr<Widget> pw,int priority); 调用以上函数 processWidget(new Widget,priority()); 以上调用错误,因为shared_ptr构造函数需要一个原始指针,但该构造函数是个explicit构造函数,无法进行隐式转换. 而且其调用顺序也无法确定. 所以,我们一般使用分离语句,创建Widget,然后置入只能指针中.最后

More Effective C++ 条款17 考虑使用lazy evaluation(缓式评估)

1. lazy evaluationg实际上是"拖延战术":延缓运算直到运算结果被需要为止.如果运算结果一直不被需要,运算也就不被执行,从而提高了效率.所谓的运算结果不被执行,有时指只有部分运算结果被需要,那么采用拖延战术,便可避免另一部分不被需要的运算,从而提高效率,以下是lazy evaluation的四种用途. 2. Reference Counting(引用计数) 如果要自己实现一个string类,那么对于以下代码: String s1="Hello"; S

effective c++ 条款17:以独立语句将newd对象置入智能指针

记住: 以独立语句将newd对象存储于智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏. int priority(); void processWidget(std::tr1::shared_ptr<Widget> pw, int priority); //编译错误,因为shared_ptr的构造函数是个explicit构造函数,无法进行隐式转换 processWidget(new Widget, priority()); //编译正确,但有潜在问题. //在调用pro

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

(一) 假设有下面这两个函数: int priority(); void processWidget(tr1::shared_ptr<Widget> pw, int priority); 现在这样调用它: processWidget(new Widget, priority()); 但是!上面这种调用不能通过编译,因为tr1::shared_ptr构造函数需要一个原始指针,但是,这个构造函数是explicit构造函数,无法进行隐式转换. 要通过编译的话,要像下面这种调用方式: processW

Effective C++ (笔记) : 条款11 -- 条款17

条款11:在operator=中处理"自我赋值" 自我赋值有时候不是那么明显,在处理循环(a[i] = a[j]).指针(*px = *py)和参数传递(func(const Base &rb, const Derived *pd))的时候可能会发生. Widget::operator=(const Widget& rhs) { delete pb; pb = new Bitmap(*rhs.pb); return *this; } 这是一份不安全的实现版本,在自赋值的

More Effective C++ 条款35 让自己习惯于标准C++ 语言

(由于本书出版于1996年,因此当时的新特性现在来说可能已经习以为常,但现在重新了解反而会起到了解C++变迁的作用) 1. 1990年后C++的重要改变 1). 增加了新的语言特性:RTTI,namespaces,bool,关键词mutable和explicit,enums作为重载函数之自变量所引发的类型晋升转换,以及"在class 定义区内直接为整数型(intergral) const static class members设定初值"的能力. 2). 扩充了Templates的特性

More Effective C++ 条款28 Smart Pointers(智能指针)

1. 智能指针(如标准库的auto_ptr,shared_ptr,weak_ptr,boost的scoped_ptr等)主要用于动态内存的管理,同时提供给用户与内置指针一样的使用方法,本条款主要涉及智能指针在构造与析构,复制和赋值,解引等方面的注意点,而非智能指针的实现细节. 2. 智能指针的构造,赋值,析构 智能指针的copy constructor,assignment operator,destructor对应于不同的观念而有不同的实现,主要有三种选择: 1).不允许对象的共享,在调用co

effective c++ 条款4 make sure that objects are initialized before they are used

1 c++ 类的数据成员的初始化发生在构造函数前 class InitialData { public: int data1; int data2; InitialData(int a, int b) { data1 = a: //this is assignment data2 = b; //this is assignment } /* InitialData(int a, int b):data1(a),data2(b) //this is initial {} */ } 2 不同cpp文

More Effective C++ 条款34 如何在一个程序中结合C++和C

1. C++和C混合使用的前提之一就是编译器产生兼容的目标文件(.lib和.dll等).所谓"兼容",指的是编译器在"预编译器相依的特性上"一致,如int和double大小,参数压栈机制等,只有在这个基础上才能讨论结合使用C++和C模块的问题. 2. 在1的基础上,要结合使用C++和C的模块,主要有以下几点需要注意: 1). name mangling(名称重整) Name mangling是C++用于支持函数重载的机制,它对重载的函数名称进行一定改变,使得每个函数