c++ primer笔记------智能指针

智能指针的陷阱

基本规范:

1.不使用相同的内置指针值初始化(或reset)多个智能指针。  double free

2.不delete get() 返回的指针。  double free

3.不使用get() 初始化或reset另一个智能指针。  double free

4.如果你使用get() 返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变为无效了。   空悬指针

5.如果你使用智能指针管理的资源不是new分配的内存,记住传递给它一个删除器。    非new类型指针需要自己指定如何来释放指针

时间: 2024-10-01 06:28:41

c++ primer笔记------智能指针的相关文章

c++ 11学习笔记--智能指针

C++ 98的 std::auto_ptr已经被彻底遗弃了,取而代之的是unique_ptr.shared_ptr与weak_ptr.大部分时候我们自己手动申请内存方式内存都是没有问题的,问题是如果程序很大了之后,一个复杂的对象,多次拷贝的代价非常高,很多地方都会使用到,只存在一份拷贝显然是最好的,这个时候对象生命周期的管理就会很复杂,所以c++引入了智能指针. 任何事物都会有两面性. Shared_ptr 摘录于Effective C++, 3rd Edition, Item 17: 在 st

c++学习笔记——智能指针

智能指针是为了便于管理动态内存,能够自动管理释放所指向的对象. 智能指针共有三种: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 笔记之指针和引用

引用必须初始化 因为引用本身不是一个对象,所以不能定义引用的引用 引用的定义 允许在一条语句中定义多个引用,其中每个引用标识符都必须以符号&开头: int i=1024, i2=2048; //i和i2都是int int &r=i, r2=i2; //r是一个引用,与i绑定在一起r2是int int i3=1024, &ri=i3; //i3是int,ri是一个引用,与i3绑定在一起 int &r3=i3, &r4=i2; //r3和r4都是引用 int &

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

0722-----C++Primer听课笔记----------句柄类和智能指针

1.再说智能指针 1.1  为什么要用智能指针?对于一个指针,它指向一个动态分配内存的对象,若同时有多个指针指向该对象,那么当我们delete的时候,就会出现delete 一个无效内存的错误,因为该对象已经被delete过了,所以这就造成了错误.针对这一情况,我们想到,new 和 delete 必须是成对出现的,那么联想到类里面,很容易想到这个构造函数和析构函数也是成对出现的,对于每一个对象,初始化的时候会调用构造函数,而销毁的时候必然要调用析构函数.因此我们就可以对 指针 进行封装,将该指针的

C++ Primer 学习笔记_56_STL剖析(十一)(原boost库):详解智能指针(unique_ptr(原scoped_ptr) 、shared_ptr 、weak_ptr源码分析)

注意:现在boot库已经归入STL库,用法基本上还和boost类似 在C++11中,引入了智能指针.主要有:unique_ptr, shared_ptr, weak_ptr. 这3种指针组件就是采用了boost里的智能指针方案.很多有用过boost智能指针的朋友,很容易地就能发现它们之间的关间: std boost 功能说明 unique_ptr scoped_ptr 独占指针对象,并保证指针所指对象生命周期与其一致 shared_ptr shared_ptr 可共享指针对象,可以赋值给shar

C++自学笔记_定义智能指针类_《C++ Primer》

包含指针的类要特别注意复制控制,原因是复制指针只复制指针中的地址,而不会复制指针所指向的对象. C++类采用以下3种方法之一管理指针成员: (1) 指针成员采取常规指针型行为.这样的类具有指针所有的缺陷但是无需特殊的复制控制. (2) 类可以是实现“智能指针”行为.指针所指向的对象是共享的,但类能够防止悬垂指针. (3) 类采取值型行为.指针所指向的对象是唯一的,由每个类对象单独管理. 这里总结第(2)种方法——采用定义智能指针类 智能指针类的思想在于: 第(1)种方法中,所有的对象中的指针都直

C++primer第十二章读书笔记---动态内存与智能指针

    目前为止我们使用过的静态内存,栈内存和内存池,静态内存用来保存局部static对象.类static成员,以及定义在任何函数之外的成员.栈内存用来保存定义在函数内部的非static成员,分配在静态 内存或栈内存中的对象由编译器自动创建或销毁,对于栈对象仅在其定义的程序块运行时才有效,static对象在程序运行之前分配,程序结束时销毁.除了静态内存和栈内存外,每个程序还拥有一个内存池(堆)在堆上分配动态对象,当动态对象不再使用时,我们必须显示的销毁它.     (一).动态内存与智能指针  

智能指针_auto_ptr2_学习笔记

//1,release函数只是简单的转移对内存的拥有权,自己变成null,不会delete,一般在将所有权转移给别的智能指针的时候使用.具体可参加源码. 例: #include <memory> #include <iostream> using namespace std; class A { public:  A(int a):m_na(a)  {      cout<<"A cont" <<endl;  }  virtual ~A(