指针

auto_ptr, unique_ptr, shared_ptr and weak_ptr智能指针讲解

我是研究僧i 提交于 2019-12-27 07:37:13
转自:https://blog.csdn.net/jxw167/article/details/72864554 C ++库提供以下类型的智能指针的实现: auto_ptr unique_ptr shared_ptr weak_ptr 它们都是在内存头文件中声明。 auto_ptr 从C ++ 11开始,此类模板已被弃用。 unique_ptr是具有相似功能但具有改进的安全性的新工具。 auto_ptr是一个智能指针,用于管理通过新表达式获取的对象,并在auto_ptr本身被销毁时删除该对象。 当使用auto_ptr类描述一个对象时,它存储一个指向单个分配对象的指针,该对象可以确保当它超出范围时,它指向的对象必须被自动销毁。 它基于独占所有权模式,即同一类型的两个指针不能同时指向相同的资源。 如下面的程序所示,复制或分配指针会更改所有权,即源指针必须赋予目标指针所有权。 [cpp] view plain copy #include<iostream> #include<memory> using namespace std; class A { public: void show() { cout << "A::show()" << endl; } }; int main() { // p1 is an auto_ptr of type A auto_ptr<A> p1( new

智能指针之 unique_ptr

淺唱寂寞╮ 提交于 2019-12-27 07:36:46
  对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存,我们 需要时刻记得释放,且不能重复释放,释放后不能再去使用. .. 因此在使用时造成很多不便,且容易出现很多问题,一旦出问题就造成core dump,程序直接挂掉 , 这个时候,智能指针的优势就体现出来了, 智能指针符合RAII原则,资源获取就是初始化,在对象析构时,将资源进行释放 ,对动态内存做到一个比较好的管理   unique_ptr 持有对对象的独有权—两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作   unique_ptr拥有所有auto_ptr的功能,且unique_ptr通过将复制构造和赋值操作符私有化,将对象的所有权独有,很好的将auto_ptr的安全问题给规避掉了,unique_ptr的其他特点包括:1.提供删除器释放对象,允许用户自定义删除器 2.添加了对象数组的偏特化实现,new[],delete[] 3.使用C++ 11的右值引用特性,实现所有权转移 std::move()   本次实现,将unique_ptr的基本接口进行了实现,基本包括了unique_ptr的功能 (编译平台:Linux centos 7.0 编译器:gcc 4.8.5 )   使用std::unique

C++智能指针 unique_ptr

北战南征 提交于 2019-12-27 07:36:31
C++智能指针 unique_ptr unique_ptr 独占所指向的对象, 同一时刻只能有一个 unique_ptr 指向给定对象(通过禁止拷贝语义, 只有移动语义来实现), 定义于 memory (非memory.h)中, 命名空间为 std. 标准库早期版本中定义了 auto_ptr, 它具有 unique_ptr 的部分特征, 但不是全部, 例如, 不能在容器中保存 auto_ptr, 也不能从函数中返回 auto_ptr. 基于这些原因, 应该尽量使用 unique_ptr, 而不是 auto_ptr, 使用 unique_ptr 替换 auto_ptr. 基本用法: std::unique_ptr<A> up1; up1.reset(new A(3)); std::unique_ptr<A> up2(new A(4)); A* p = up2.release(); delete p; std::unique_ptr<A> up3(new A(11)); std::unique_ptr<A> up4 = std::move(up3); up4 = nullptr;//显式销毁所指对象,同时智能指针变为空指针。与u_s2.reset()等价 成员函数 (1) get 获得内部对象的指针, 由于已经重载了()方法, 因此和直接使用对象是一样的.如 unique_ptr

Boost智能指针——scoped_ptr

拈花ヽ惹草 提交于 2019-12-27 07:36:06
boost::scoped_ptr 和 std::auto_ptr 非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用: #include <string> #include <iostream> #include <boost/scoped_ptr.hpp> class implementation { public : ~implementation() { std::cout << "destroying implementation\n" ; } void do_something() { std::cout << "did something\n" ; } }; void test() { boost::scoped_ptr<implementation> impl( new implementation()); impl->do_something(); } void main() { std::cout<< "Test Begin ... \n" ; test(); std::cout<< "Test End.\n" ; } 该代码的输出结果是: Test Begin ... did something destroying implementation Test End. 可以看到:当 implementation

智能指针shared_ptr的用法

让人想犯罪 __ 提交于 2019-12-27 07:35:41
原文链接: https://www.cnblogs.com/jiayayao/archive/2016/12/03/6128877.html   为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer)。   智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈上的变量自动被销毁,智能指针内部保存的内存也就被释放掉了(除非将智能指针保存起来)。   C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需添加头文件<memory>。   shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,删除所指向的堆内存。shared_ptr内部的引用计数是安全的,但是对象的读取需要加锁。 shared_ptr的基本用法 初始化   可以通过构造函数、std::make_shared<T>辅助函数和reset方法来初始化shared_ptr: #include "stdafx.h" #include <iostream> #include <future> #include <thread> using namespace

[C++] Boost智能指针——boost::shared_ptr(使用及原理分析)

旧时模样 提交于 2019-12-27 07:35:10
简介 boost::shared_ptr是可以 共享所有权 的指针。如果有多个shared_ptr共同管理同一个对象时,只有这些shared_ptr全部与该对象脱离关系之后,被管理的对象才会被释放。通过下面这个例子先了解下shared_ptr的基本用法: 1 #include <iostream> 2 #include <string> 3 #include <boost/shared_ptr.hpp> 4 5 using namespace std; 6 7 class Book 8 { 9 private: 10 string name_; 11 12 public: 13 Book(string name) : name_(name) 14 { 15 cout << "Creating book " << name_ << " ..." << endl; 16 } 17 18 ~Book() 19 { 20 cout << "Destroying book " << name_ << " ..." << endl; 21 } 22 }; 23 24 int main() 25 { 26 cout << "=====Main Begin=====" << endl; 27 { 28 boost::shared_ptr<Book> myBook(new Book("「1984」"

C++智能指针

无人久伴 提交于 2019-12-27 07:34:48
一、为什么使用智能指针?智能指针的原理? C/C++中的堆内存分配和释放的方式主要是: malloc/free 以及 new/delete 等。 使用new 和delete 管理内存存在三个常见问题: 1.忘记delete(释放) 内存,或者异常导致程序过早退出,没有执行 delete。忘记释放动态内存会导致内存泄露问题,长时间这样会导致系统内存越来越小。 (内存泄露问题往往很难查找到,内存耗尽时,才能检测出这种错误) 2.使用已经释放掉的对象。比如:我们使用delete释放掉申请的内存空间,但并未去除指向这片空间的指针,此时指针指向的就是“垃圾”内存。 3.同一块内存释放两次。当有两个指针指向相同的动态内存分配对象时,其中一个进行了delete操作,对象内存就还给了操作系统 ,如果我们要delete第二个指针,那么内存有可能遭到破坏。(浅拷贝问题) 使用智能指针可以很大程度上的避免这些问题。 智能指针就是一个类,类的构造函数中传入一个普通指针,当超出了类的作用域时,类会自动调用析构函数,释放资源。其核心思想是:栈上对象在离开作用范围时会自动析构。 智能指针在C++11版本之后提供,包含在头文件<memory>中,shared_ptr、unique_ptr、weak_ptr,auto_ptr在C++11被弃用。 二、常用的智能指针 1、auto_ptr:自动指针,自动回收

ida 动态调试 快捷键

£可爱£侵袭症+ 提交于 2019-12-27 07:28:59
快捷键 1.F2下断点 2.F7进入函数,F8单步调试,F9跳到下一个断点,F2下断点,G调到函数地址 3.N重名 4.g跳到地址和函数名 5.u取消把函数汇编变成机器码 6.c就是把机器码变成汇编 7.F5 8.p分析函数,把机器码那些东西翻译成函数 9.ctrl+s看见系统所有的模块 10.ctrl+f搜索 11.单步调试注意右上角,寄存器变蓝色表示被改了 12.otions->number of opcode bytes可以查看机器码,填入4一行看4个机器码 13.在hex view-1按F2可以修改机器码,再次按F2确定修改 14.alt+g看是thumb还是arm指令 15.在函数名上按X可以看见上层调用 16.在f5伪c/c++代码的情况下,注释是/,汇编情况下注释是; 17.f4移动到光标处 18.在寄存器窗口按E可以修改寄存器的值 19.在内存窗口f2可以修改内存的值 ———————————————— 在android调试中,你会经常见到这种类型的函数: 首先是一个指针加上一个数字,比如v3+676。然后将这个地址作为一个方法指针进行方法调用,并且第一个参数就是指针自己,比如(v3+676)(v3…)。这实际上就是我们在JNI里经常用到的JNIEnv方法。因为Ida并不会自动的对这些方法进行识别

[iOS面试] 理解 copy

牧云@^-^@ 提交于 2019-12-27 05:27:02
前言 NSObject 有 copy 和 mutableCopy 两个成员。这两个函数是分别直接返回 copyWithZone 和 mutableCopyWithZone 的返回值。 因此,如果调用者没有实现 copyWithZone 或 mutableCopyWithZone,肯定会报错:unrecognized selector。 这两个函数,就分别是 NSCopying,NSMutableCopying 协议的成员。 (注意,不是这个: + (id)copyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE; 这个是 MRC 项目可用,ARC 下直接无视该函数,涉及到 Zone 都用 null) 基础框架里的类,很多都实现了 NSCopying,NSMutableCopying,例如 NSString 可以调用 copy 而不报错。那么,这些基础框架是具体怎么实现的这两个协议,才导致了所谓的 “深浅拷贝” ?数组的 [[NSArray alloc] initWithArray: copyItems: ] 到底是干什么的? strong 与 copy 到底用哪个?这些是本文将要回答的。 copy 和 mutableCopy 不可变对象的 copy:指针复制 指针到底是什么?指针本质上是一个 size_t 大小的一个数

const 指针与指向const的指针

孤人 提交于 2019-12-27 02:28:02
const 指针与指向 const 的指针 当使用带有const 的指针时其实有两种意思。一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。听起来有点混淆一会放个例子上来就明白了。 先说指向const 的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法。 const int* p; (推荐) int const* p; 第一种可以理解为,p 是一个指针,它指向的内容是 const int 类型。 p 本身不用初始化它可以指向任何标示符,但它指向的内容是不能被改变的。 第二种很容易被理解成是p 是一个指向 int 的 const 指针(指针本身不能被修改),但这样理解是错误的,它也是表示的 是指向const 的指针 (指针指向的内容是不能被修改的),它跟第一种表达的是一个意思。为了避免混淆推荐大家用第一种。 再说 const 指针 ,它的意思是指针本身的值是不能被修改的。它只有一种写法 int* const p= 一个地址 ; ( 因为指针本身的值是不能被修改的所以它必须被初始化) 这种形式可以被理解为,p 是一个指针,这个指针是指向 int 的 const 指针。它指向的值是可以被改变的如 *p=3; 还有一种情况是这个指针本身和它指向的内容都是不能被改变的,请往下看。 const int* const p= 一个地址 ; int const*