美文网首页
智能指针

智能指针

作者: ustclcl | 来源:发表于2019-08-22 22:20 被阅读0次

智能指针

#include <memory>

三种智能指针

shared_ptr

有引用计数,当最后一个shared_ptr被销毁,其指向的对象将被析构。

例子:

#include <iostream>
#include <memory>
#include <iterator>

using namespace std;

class Foo{
    public:
    Foo() {p = new int[10];cout << "new@" << p <<endl;}
    ~Foo() {cout << "release@" << p << endl;delete [] p;p=nullptr;}
    int *p;
};

void smartptr()
{
    shared_ptr<Foo> sp1 = make_shared<Foo>();
    auto sp2 = make_shared<Foo>();
}
void ptr()
{
    auto p = new Foo;
}
int main(int argc,char* argv[])
{
    smartptr();
    ptr();
    return 0;
}

其输出结果为

new@0x1001370
new@0x10013b8
release@0x10013b8
release@0x1001370
new@0x1001368

make_shared<>是库函数,将会new一个对象,然后绑定到shared_ptr

  • 在子函数smartptr中两个临时变量是共享指针,在退出子函数时会被销毁,销毁时调用了对象的析构函数。
  • 而ptr函数里只是普通指针,退出销毁时没有调用析构函数,造成内存泄漏。

删除器

使用智能指针还可以定义自己的释放操作,这是针对那些没有合适析构函数的对象或是c语言的代码

#include <memory>
#include <iostream>
using namespace std;

typedef int fd;

fd fileid = 0;

fd open()
{
    cout << "open " << fileid << endl;
    return fileid++;
}
void close(fd f)
{
    cout << "close " << f << endl;
    fileid--;
}

void end_fd(fd* f){close(*f);}

void foo()
{
    fd g = open();
    shared_ptr<fd> sp(&g,end_fd);
}

int main(int argc, char *argv[])
{
    foo();
}

输出

open 0
close 0

需要注意的是传入的删除器函数的参数必须是智能指针保存的指针类型才可以通过编译。

unique_ptr

不能拷贝,不能赋值,拥有指向的对象

可以直接初始化

unique_ptr<string> p1(new string("I am unique"))
unique_ptr<string> p2(p1); //错误,不支持拷贝
unique_ptr<string> p2;
p2=p1;//错误,不支持赋值

需要转移控制权的话,可以用

unique_ptr<string> p2(p1.release())

或者

unique_ptr<string> p2;
p2.reset(p1.release());

weak_ptr

需要一个shared_ptr来初始化它,不影响shared_ptr的计数

weak_ptr<T> wp(sp)

操作

wp.reset()  //置为空
wp.use_count()  //返回指向对象的shared_ptr的数量
wp.expired() //wp.use_count()为0,返回true
wp.lock()  //wp.expired()为true,则返回一个共享的shared_ptr,否则返回一个空的shared_ptr

weak_ptr的作用就是辅助shared_ptr的,比如解决shared_ptr相互引用的问题而不能释放的问题。

相关文章

  • 目录

    智能指针(1) 智能指针(2) 智能指针(3) 智能指针之使用 容器 - vector(1) 容器 - vecto...

  • 智能指针到Android引用计数

    智能指针 LightRefBase RefBaseStrongPointerWeakPointer 智能指针 这是...

  • C++面试重点再梳理

    智能指针 请讲一下智能指针原理,并实现一个简单的智能指针 智能指针其实不是一个指针。它是一个用来帮助我们管理指针的...

  • C++研发工程师笔试题/面试题(1-10)

    1. (1) 简述智能指针的原理;(2)c++中常用的智能指针有哪些?(3)实现一个简单的智能指针。 简述智能指针...

  • 第十六章 string类和标准模板库(2)智能指针模板类

    (二)智能指针模板类 智能指针是行为类似指针的类对象,但这种对象还有其他便于管理内存的功能。 1.使用智能指针 (...

  • Rust for cpp devs - 智能指针

    与 cpp 类似,Rust 也有智能指针。Rust 中的智能指针与引用最大的不同是,智能指针 own 内存,而引用...

  • C++ 引用计数技术及智能指针的简单实现

    1.智能指针是什么 简单来说,智能指针是一个类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作。...

  • 智能指针

    1. 什么是智能指针? 智能指针是行为类似于指针的类对象,但这种对象还有其他功能。 2. 为什么设计智能指针? 引...

  • chrome中智能指针使用

    chrom中智能指针的概述和作用 chrome中智能指针的用法和总结 包含如下四种智能指针:scoped_ptr ...

  • c++智能指针用法

    智能指针是什么 智能指针是c++中有四个智能指针:auto_ptr、shared_ptr、weak_ptr、uni...

网友评论

      本文标题:智能指针

      本文链接:https://www.haomeiwen.com/subject/qycasctx.html