fbpx
维基百科

智能指针

智能指针(英語:Smart pointer)是一種抽象的資料類型。在程式設計中,它通常是經由类模板來實作,藉由模板來達成泛型,藉由類別的解構函數來達成自動釋放指標所指向的記憶體或物件。

C++中的智能指针 编辑

auto_ptr 编辑

auto_ptr這個類別模板被定義在ISO/IEC 14882的第20.4.5章節裡:

namespace std {  template <class Y> struct auto_ptr_ref {};  template <class X>  class auto_ptr {  public:  typedef X element_type;  // 20.4.5.1 construct/copy/destroy:  explicit auto_ptr(X* p =0)throw();  auto_ptr(auto_ptr&)throw();  template <class Y> auto_ptr(auto_ptr<Y>&)throw();  auto_ptr& operator=(auto_ptr&)throw();  template <class Y> auto_ptr& operator=(auto_ptr<Y>&)throw();  auto_ptr& operator=(auto_ptr_ref<X>)throw();  ~auto_ptr() throw();  // 20.4.5.2 members:  X& operator*() const throw();  X* operator->() const throw();  X* get() const throw();  X* release() throw();  void reset(X* p =0)throw();  // 20.4.5.3 conversions:  auto_ptr(auto_ptr_ref<X>)throw();  template <class Y> operator auto_ptr_ref<Y>() throw();  template <class Y> operator auto_ptr<Y>() throw();  }; } 

unique_ptr 编辑

C++11中提供了std::unique_ptr,定义在<memory>头文件中。

C++11新增了move语义,相比copy语义,它能更好的实现值传递.std::auto_ptr使用的是copy语义,为了向后兼容,C++11没有修改std::auto_ptr,而是引入了新的使用move语义的std::unique_ptr.

unique_ptr的拷贝构造函数和赋值运算符都声明为deleted,也就是说它不能被拷贝,只能通过std::move来转递它所指向的内存的所有权。

std::unique_ptr<int> p1(new int(5)); std::unique_ptr<int> p2 = p1; // 编译会出错 std::unique_ptr<int> p3 = std::move (p1); // 转移所有权,现在那块内存归p3所有, p1成为无效的指针。 p3.reset(); //释放内存。 p1.reset(); //实际上什么都没做。 

std::auto_ptr依然存在,但在C++11中被标为"弃用".

shared_ptr和weak_ptr 编辑

基于Boost库, C++11加入了shared_ptrweak_ptr.它们最早在TR1中就被引入,但在C++11中,在Boost的基础上又加入了新的功能。

std::shared_ptr使用引用计数。每一个shared_ptr的拷贝都指向相同的内存。在最后一个shared_ptr析构的时候,内存才会被释放。

std::shared_ptr<int> p1(new int(5)); std::shared_ptr<int> p2 = p1; // 都指向同一内存。 p1.reset(); // 因为p2还在,所以内存没有释放。 p2.reset(); // 释放内存,因为没有shared_ptr指向那块内存了。 

std::shared_ptr使用引用计数,所以有循环计数的问题。为了打破循环,可以使用std::weak_ptr.顾名思义, weak_ptr是一个弱引用,只引用,不计数。如果一块内存被shared_ptr和weak_ptr同时引用,当所有shared_ptr析构了之后,不管还有没有weak_ptr引用该内存,内存也会被释放。所以weak_ptr不保证它指向的内存一定是有效的,在使用之前需要检查。

std::shared_ptr<int> p1(new int(5)); std::weak_ptr<int> wp1 = p1; // 还是只有p1有所有权。 {  std::shared_ptr<int> p2 = wp1.lock(); // p1和p2都有所有权  if (p2) // 使用前需要检查  {   // 使用p2  } } // p2析构了,现在只有p1有所有权。 p1.reset(); // 内存被释放。 std::shared_ptr<int> p3 = wp1.lock(); // 因为内存已经被释放了,所以得到的是空指针。 ifp3 {  // 不会执行到这。 } 

外部連結 编辑

  • Sample chapter "Smart Pointers (页面存档备份,存于互联网档案馆)" from the book Modern C++ Design: Generic Programming and Design Patterns Applied (页面存档备份,存于互联网档案馆 by Andrei Alexandrescu, Addison-Wesley, 2001.
  • Code example "countptr.hpp (页面存档备份,存于互联网档案馆)" from the book The C++ Standard Library - A Tutorial and Reference (页面存档备份,存于互联网档案馆 by Nicolai M. Josuttis
  • "Boost Smart Pointers (页面存档备份,存于互联网档案馆)"
  • Article "The New C++: Smart (er) Pointers (页面存档备份,存于互联网档案馆)" by Herb Sutter August 01, 2002
  • "Smart Pointers - What, Why, Which? (页面存档备份,存于互联网档案馆)" by Yonat Sharon
  • "Smart Pointers Overview (页面存档备份,存于互联网档案馆)" by John M. Dlugosz
  • The YASPER library (页面存档备份,存于互联网档案馆) Yet Another Smart Pointer implementation in C++
  • Smart Pointers in Delphi (页面存档备份,存于互联网档案馆

智能指针, 英語, smart, pointer, 是一種抽象的資料類型, 在程式設計中, 它通常是經由类模板來實作, 藉由模板來達成泛型, 藉由類別的解構函數來達成自動釋放指標所指向的記憶體或物件, 目录, 中的, auto, unique, shared, ptr和weak, 外部連結c, 中的, 编辑auto, 编辑, 更多信息, auto, auto, ptr這個類別模板被定義在iso, 14882的第20, 5章節裡, namespace, template, class, struct, auto, t. 智能指针 英語 Smart pointer 是一種抽象的資料類型 在程式設計中 它通常是經由类模板來實作 藉由模板來達成泛型 藉由類別的解構函數來達成自動釋放指標所指向的記憶體或物件 目录 1 C 中的智能指针 1 1 auto ptr 1 2 unique ptr 1 3 shared ptr和weak ptr 2 外部連結C 中的智能指针 编辑auto ptr 编辑 更多信息 en auto ptr auto ptr這個類別模板被定義在ISO IEC 14882的第20 4 5章節裡 namespace std template lt class Y gt struct auto ptr ref template lt class X gt class auto ptr public typedef X element type 20 4 5 1 construct copy destroy explicit auto ptr X p 0 throw auto ptr auto ptr amp throw template lt class Y gt auto ptr auto ptr lt Y gt amp throw auto ptr amp operator auto ptr amp throw template lt class Y gt auto ptr amp operator auto ptr lt Y gt amp throw auto ptr amp operator auto ptr ref lt X gt throw auto ptr throw 20 4 5 2 members X amp operator const throw X operator gt const throw X get const throw X release throw void reset X p 0 throw 20 4 5 3 conversions auto ptr auto ptr ref lt X gt throw template lt class Y gt operator auto ptr ref lt Y gt throw template lt class Y gt operator auto ptr lt Y gt throw unique ptr 编辑 C 11中提供了std unique ptr 定义在 lt memory gt 头文件中 C 11新增了move语义 相比copy语义 它能更好的实现值传递 std auto ptr使用的是copy语义 为了向后兼容 C 11没有修改std auto ptr 而是引入了新的使用move语义的std unique ptr unique ptr的拷贝构造函数和赋值运算符都声明为deleted 也就是说它不能被拷贝 只能通过std move来转递它所指向的内存的所有权 std unique ptr lt int gt p1 new int 5 std unique ptr lt int gt p2 p1 编译会出错 std unique ptr lt int gt p3 std move p1 转移所有权 现在那块内存归p3所有 p1成为无效的指针 p3 reset 释放内存 p1 reset 实际上什么都没做 std auto ptr依然存在 但在C 11中被标为 弃用 shared ptr和weak ptr 编辑 基于Boost库 C 11加入了shared ptr和weak ptr 它们最早在TR1中就被引入 但在C 11中 在Boost的基础上又加入了新的功能 std shared ptr使用引用计数 每一个shared ptr的拷贝都指向相同的内存 在最后一个shared ptr析构的时候 内存才会被释放 std shared ptr lt int gt p1 new int 5 std shared ptr lt int gt p2 p1 都指向同一内存 p1 reset 因为p2还在 所以内存没有释放 p2 reset 释放内存 因为没有shared ptr指向那块内存了 std shared ptr使用引用计数 所以有循环计数的问题 为了打破循环 可以使用std weak ptr 顾名思义 weak ptr是一个弱引用 只引用 不计数 如果一块内存被shared ptr和weak ptr同时引用 当所有shared ptr析构了之后 不管还有没有weak ptr引用该内存 内存也会被释放 所以weak ptr不保证它指向的内存一定是有效的 在使用之前需要检查 std shared ptr lt int gt p1 new int 5 std weak ptr lt int gt wp1 p1 还是只有p1有所有权 std shared ptr lt int gt p2 wp1 lock p1和p2都有所有权 if p2 使用前需要检查 使用p2 p2析构了 现在只有p1有所有权 p1 reset 内存被释放 std shared ptr lt int gt p3 wp1 lock 因为内存已经被释放了 所以得到的是空指针 if p3 不会执行到这 外部連結 编辑Sample chapter Smart Pointers 页面存档备份 存于互联网档案馆 from the book Modern C Design Generic Programming and Design Patterns Applied 页面存档备份 存于互联网档案馆 by Andrei Alexandrescu Addison Wesley 2001 Code example countptr hpp 页面存档备份 存于互联网档案馆 from the book The C Standard Library A Tutorial and Reference 页面存档备份 存于互联网档案馆 by Nicolai M Josuttis Boost Smart Pointers 页面存档备份 存于互联网档案馆 Article The New C Smart er Pointers 页面存档备份 存于互联网档案馆 by Herb Sutter August 01 2002 Smart Pointers What Why Which 页面存档备份 存于互联网档案馆 by Yonat Sharon Smart Pointers Overview 页面存档备份 存于互联网档案馆 by John M Dlugosz The YASPER library 页面存档备份 存于互联网档案馆 Yet Another Smart Pointer implementation in C Smart Pointers in Delphi 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title 智能指针 amp oldid 65453922, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。