读书笔记_Effective_C++_条款十七:以独立语句将new产生的对象置入智能指针

int get_int();
void f(shared_ptr<int> a, int);
//下面调用
f(new int(3), get_int());//如果是类而不是int就可以会有有explicit,就不能隐式转换
f(shared_ptr<int> a = new int(3), get_int());//还有显式转换
//然而都不是好方法
//从小老师就教导我们不同的编译器,调用参数顺序是不一样的
//在调用内存时,不要烦多写几句
//*****以独立语句将new产生的对象置入智能指针********
shared_ptr<int> a = new int(3);
f(a, get_int());

  

时间: 2024-11-10 22:29:14

读书笔记_Effective_C++_条款十七:以独立语句将new产生的对象置入智能指针的相关文章

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++ 条款17 以独立语句将newed对象置入智能指针

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

Effective 学习之以独立语句将newed对象置入智能指针

时间:2014.05.23 地点:基地 --------------------------------------------------------------------------------- 一.常识 C/C++中函数在被调用时,函数的参数的执行顺序是不确定的. --------------------------------------------------------------------------------- 二.问题 假设有两个函数,一个揭示处理程序的优先权,还一个用

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&

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

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

这一节也比较简单,先假设我们有如下的函数: int foo(); void memFoo(shared_ptr<T> pw, int foo); 现在假设我们要调用memFoo函数: memFoo(new W, foo()); 但是这样写编译是通不过的,我们可以改造为: memFoo(shared_ptr<p>(new W), foo()); 这样编译就没有问题了,但是却可能出现内存泄露问题,为什么呢? 因为编译器在产出一个memFoo调用码之前,必须先核对即将被传递的各个实参,即

读书笔记_Effective_C++_条款二十五: 考虑写出一个不抛出异常的swap函数

在之前的理论上调用对象的operator=是这样做的 void swap(A& x) { std::swap(a, x.a); } A& operator=(const A& a) { A temp = a; swap(temp); return *this; } 上面的代码看起来有点麻烦,但它是一个好办法. 我们可以在std里面特化我们的swap class A { private: int a; public: void swap(A& x)//防止写成friend,我

读书笔记_Effective_C++_条款二十一:当必须返回对象时,别妄想返回其reference

在栈空间的临时成员变量在函数生命期结束后无法传出 friend A& operator*(const A& a, const A& b) { A temp; temp.data = a.data*b.data;//a,b的成员变量相乘 return temp; } 既然栈空间不行,试试堆空间 friend A& operator*(const A& a, const A& b) { A *temp=new A; temp.data = a.data*b.da

读书笔记_Effective_C++_条款二十二:将成员变量声明为private

1.格式统一 在调用的时候,不会去想有没有(),一律是有get(),或者set()之类的. 2.封装 能直接访问得越少,表明封装性越高, 封装性越高,我们的顾虑就少了, 例如:我们a.data*0.9的时候,不需要调用出来*0.9.只需用public的get()来调用在修改一下就好了 为什么不使用protected 在没有继承下的class下protected和private是一样的 但在发生了继承的情况下,原来只能用父类函数调用的数据,因为protected,完全暴露了出来. 而且,用了pri