C++ Primer 笔记——智能指针】的更多相关文章

1.新的标准库提供了两种智能指针类型,shared_ptr允许多个指针指向同一个对象,unique_ptr则独占所指的对象.标准库还定义了一个名为weak_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象. 2.智能指针也是模板,默认初始化的智能指针中保存着一个空指针. 3.智能指针的操作: 4.make_shared用参数来构造指定类型的对象. std::shared_ptr<int> p = std::make_shared<int>(42); // 指向一…
智能指针是为了便于管理动态内存,能够自动管理释放所指向的对象. 智能指针共有三种:1.shared_ptr允许多个指针指向同一个对象:2.unique_ptr独占所指向的对象:3.weak_ptr是一个伴随类,它是一种弱引用,指向shared_ptr所管理的对象.这三种类型都定义在memory头文件中. 下面是一个在网上看到的智能指针的实现原理代码: class U_Ptr { friend class HasPtr; int *ip; size_t use; U_Ptr(int *p) : i…
本篇随笔仅作为个人学习<C++ Primer>智能指针一节后的部分小结,抄书严重,伴随个人理解.主要介绍shared_ptr.make_shared.weak_ptr的用法和联系. C++通过一对运算符 new 和 delete 进行动态内存管理,new在动态内存中为对象分配空间并返回一个指向该对象的指针,delete接受一个动态对象的指针,销毁对象并释放与之相关的内存.然而这样的动态内存的使用很危险,因为无法确保始终能在合适的时间释放内存对象.如果忘记释放内存,可能造成内存泄露:如果在尚有指…
一.智能指针学习总结 1.一个非const引用无法指向一个临时变量,但是const引用是可以的! 2.C++中的delete和C中的free()类似,delete NULL不会报"double free"的oops. int main(int argc, char **argv) { int i; int *p = new int; delete p; p = NULL; delete p; ; } 3.智能指针的实现思想:使用可以自动销毁的局部对象来描述不可以自动销毁的位于堆空间中的…
1. 设计思想 智能指针是行为类似于指针的类对象,但这种对象还有其他功能.首先,看下面的函数: void remodel(std::string & str) { std::string * ps = new std::string(str); ... if (weird_thing()) throw exception(); str = *ps; delete ps; return; } 当出现异常时(weird_thing()返回true),delete将不被执行,因此将导致内存泄露.可以用…
C++ primer plus 16.2节介绍了auto_ptr,该模板类在C++11中已弃用,目前已被shared_ptr代替. auto_ptr又叫做智能指针,用于管理动态内存分配的用法. 为什么要有auto_ptr? 首先看一个例子, void remodel(string &str){ string *ps = new string(str); ... str = ps; return; } 此例子有什么缺陷呢? 函数结束的时候没有释放内存,这导致了内存的泄露,指针ps会被释放,但是其指…
一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回一个整数的函数 } void func2(AutoPtr<int*> ptr,int t){ //一些操作 } int main(){ func2(AutoPtr<int*>(new int(5)),func1()); //其他操作 } 乍一看,这段代码好像没有什么问题,但实则暗藏隐患…
智能指针是一个类对象,而非一个指针对象. 原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 它的一种通用实现方法是采用引用计数的方法.智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针. 每次创建类的新对象时,初始化指针并将引用计数置为1: 当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数: 对一个对象进行赋值时,赋值操作符减少左操作数所指对象…
shared_ptr和new结合使用 一个shared_ptr默认初始化为一个空指针.我们也可以使用new返回的指针来初始化一个shared_ptr: shared_ptr<double> p1; shared_ptr<int> p2(new int(42)); // p2指向一个值为42的int 接受指针参数的智能指针构造函数是explicit的,因此,我们不能将一个内置指针隐式的转换为一个智能指针,必须使用直接初始化形式: shared_ptr<int> p1 =…
OSG的智能指针,osg::ref_ptr<> osg::Referenced类管理引用计数内存块,osg::ref_ptr需要使用以它为基类的其它类作为模板参数. osg::ref_ptr<>类模板重新实现了一系列C++重载符和成员函数,主要有: T* get(): 返回管理的指针, { return _ptr; } T& operator*(): 返回间接引用,{ return *_ptr; } T* operator->():  { return _ptr; }…