C++11引入了三种主要的智能指针:unique_ptr、shared_ptr和weak_ptr。...通过移动构造函数将所有权转移给另一个unique_ptr std::unique_ptr ptr2 = std::move(ptr); // 注意,此时ptr已经为空指针,...// 使用lock()函数获取一个shared_ptr std::shared_ptr ptr3 = weakPtr.lock(); if (ptr3 !...weak_ptr 具有以下特点和用法: 弱引用:因为 weak_ptr 不会增加引用计数,所以当所有 shared_ptr 都释放后,weak_ptr 将自动失效。...通过 shared_ptr 创建:通常,我们使用 shared_ptr 来初始化 weak_ptr。这样可以确保 weak_ptr 观察的对象仍然存在。
class unique_ptr;可以看到,Deleter 的类型是 unique_ptr 类型的一部分。...回到 unique_ptr,现在我们知道 unique_ptr 的报错链路是 unique_ptr->delete->sizoef,也就是 sizeof 才是罪魁祸首。...继续深挖一下,这个问题会出现在 shared_ptr 吗?答案是不会。这又引入了另一个问题,shared_ptr 和 unique_ptr 的封装有什么不同?...shared_ptr 的封装按理说 shared_ptr.reset 的时候需要 delete ptr 就需要 ptr 的类型(错了请指正),而 shared_ptr 的 template type 可以是...总结unique_ptr 只保存了类型指针 ptr 和这个指针的析构方法,调用 delete ptr,就需要ptr的完整类型,为了防止这个问题出现,直接通过 assert sizeof 排除掉了这种风险
shared_ptr template class shared_ptr; (C++11 起) 多个shared_ptr管理同一个指针,仅当最后一个shared_ptr析构时,指针才被...引用计数指的是,所有管理同一个裸指针(raw pointer)的shared_ptr,都共享一个引用计数器,每当一个shared_ptr被赋值(或拷贝构造)给其它shared_ptr时,这个共享的引用计数器就加...T> class Shared_Ptr{ public: Shared_Ptr(T* ptr = nullptr) :_pPtr(ptr) , _pRefCount(new int(1))...多个无关的shared_ptr管理同一裸指针 只能通过复制构造或复制赋值其值给另一 shared_ptr ,将对象所有权与另一 shared_ptr 共享。...(shared_ptr p1, shared_ptr p2); // 使用 f(shared_ptr(new A), shared_ptr(new B));
在博文https://blog.csdn.net/qq_27717921/article/details/82940519已经介绍了unique_ptr和shared_ptr的使用,但是这两类的智能指针是如何做到管理指针的呢...shared_ptr 头文件 template class SharedPointer { public: SharedPointer(T *ptr = nullptr, const...std::function &del = Deleter()): p(ptr), use_c(new std::size_t(ptr !...构造函数 shared_ptr p1(new int (2)); SharedPointer(T *ptr = nullptr, const std::function &...del = Deleter()): p(ptr), use_c(new std::size_t(ptr !
然后将类实例的成员变量share指针也指向这个类实例 #include #include class Node { public: std::shared_ptr...p; }; int main() { std::shared_ptrnode(new Node()); node->p=node; std::cout<...指针解决循环引用问题,weak只引用资源不增加资源引用的计数 #include #include class Node { public: std::weak_ptr...p; }; int main() { std::shared_ptrnode(new Node()); node->p=node; std::cout<
--Microsoft Docs 为了支持对 RAII 原则的简单采用,C++ 标准库提供了三种智能指针类型: std::unique_ptr std::shared_ptr std::weak_ptr...unique_ptr,只可以被移动给另一个unique_ptr。...所以 weak_ptr 的作用就来了: 【伪代码】 class node{ weak_ptr start; weak_ptr end; } shared_ptr...所以,weak_ptr 的作用就是作为一个 "观察者" 访问 shared_ptr 本身,而不是 shared_ptr 所托管的资源。...同时也意味着,weak_ptr 只能访问它所观察的 shared_ptr 本身,而不能访问 share_ptr 托管的资源,所以,它不会增加 shared_ptr 的引用计数。
T> class scoped_ptr : noncopyable { private: T *px; scoped_ptr(scoped_ptr...const &); scoped_ptr & operator=(scoped_ptr const &); typedef scoped_ptr this_type...=( scoped_ptr const & ) const; public: explicit scoped_ptr(T *p = 0); ~scoped_ptr...此外,还可以使用 auto_ptr 对象 构造一个scoped_ptr 对象: scoped_ptr( std::auto_ptr p ): px( p.release() ); 由于scoped_ptr...typedef boost::shared_ptr parent_ptr; typedef boost::shared_ptr child_ptr; class Child
今天了解了PTR解析记录才明白是怎么一回事。 ---- 平常解析域名用的最多的应该就是A(AAAA)/CNAME类型了,其他的很少用到,也很少了解到。今天就说一下 我对PTR记录的理解。...百度百科中写到: PTR (Pointer Record),指针记录,是电子邮件系统中的一种数据类型,被互联网标准文件RFC1035所定义。与其相对应的是A记录、地址记录。二者组成邮件交换记录。...所以可以粗糙的理解为, PTR是A记录的反向,可以通过IP地址查到对应的域名记录。而拥有这个权限的是ISP(互联网服务提供商),只有向ISP申请才能实现PTR解析。...在php中,可以使用 gethostbyaddr 函数来进行查询; 在Linux下,可以通过 host 1.1.1.1 直接查询,或者 host -t PTR 1.1.1.1 来查询; 也可以通过 nslookup
我们无需关心销毁只管尽情的申请,系统提供了一个 auto_ptr 类可以使用这样的功能。后面我们也会用简单的代码示例介绍 auto_ptr 内部是如何实现的。...A(){cout << “A constructor” << endl;}; ~A(){cout << “A destructor” << endl;}; }; void foo() { auto_ptr...可以对构造出来的对象解引用 A& operator*() { return *_p; } private: A* _p; }; void foo() { // 构造一个SPA对象,传递一个A的指针 SPA ptr...(new A); // 调用重载的->运算符 ptr->display(); // 调用重载的*运算符 (*ptr).display(); // 出栈后让栈上的SPA对象析构 // 调用了析构函数,所以会自动销毁
Assemble指令中标识大小 在Assemble中通常会看到WORD ptr或者DWORD ptr或者BYTE ptr等关键字,这些关键字主要用来标识指令操作数的大小(或者说长度) WORD ptr...:标识该操作数为1个字 DWORD ptr:标识该操作数为2个字 BYTE ptr:标识该操作数为1个字节 基础知识 1 BYTE = 8 bits 1 WORD = 2 BYTE 1 DWORD...= 2 WORD 举例 and dword ptr [ebp-4], 0 ebp为栈指针的基址指针,总是指向当前方法栈的最底部,当函数返回后,该寄存器中的指针才会返回。...由于只是指出了目的操作数的内存基址,但是没有指出寄存器到底要操作一个BYTE,还是一个WORD,还是DWORD,所以需要加上dword ptr来表示进行与操作的时候,读取从ss:ebp-4的位置到ss:...参考资料 What does "dword ptr" mean? In assembly, what does "PTR" stand for?
(long error) { return (void *) error; } static inline long __must_check PTR_ERR(const void *...ptr) { return (long) ptr; } static inline long __must_check IS_ERR(const void *ptr) {...*ptr) { return !...ptr || IS_ERR_VALUE((unsigned long)ptr); } 内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。...错误的返回地址和错误号是可以使用 ERR_PTR、PTR_ERR 相互转化的。
比如如果比较 shared_ptr 和 shared_ptr 的时候。...std::shared_ptr 和 boost::shared_ptr 的差异 在写单元测试的时候,我发现 std::shared_ptr 和 boost::shared_ptr 的实现上还有一些行为上的差异...这里 strong_rc_ptr 保持和 std::shared_ptr 的行为一致。...我也是觉得 std::shared_ptr 的行为更符合直觉,所以按 std::shared_ptr 的行为为准。 单元测试 单元测试我直接就扒了 boost.shared_ptr 的了。...compat_strong_ptr_function_trait::template shared_ptr; using weak_ptr = typename compat_strong_ptr_function_trait
{ private: T *px; scoped_ptr(scoped_ptr const &); scoped_ptr &operator=...(scoped_ptr const &); typedef scoped_ptr this_type; void operator==( scoped_ptr ...=( scoped_ptr const & ) const; public: explicit scoped_ptr(T *p = 0); ~scoped_ptr...此外,还可以使用 auto_ptr 对象 构造一个scoped_ptr 对象: scoped_ptr( std::auto_ptr p ): px( p.release() ); 由于scoped_ptr...typedef boost::shared_ptr parent_ptr; typedef boost::shared_ptr child_ptr; class Child
p0 = std::unique_ptr(new int { 1 }); std::unique_ptr p1 = std::unique_ptr = 0> explicit unique_ptr(pointer _Ptr) noexcept : _Mypair(_Zero_then_variadic_args_t{}, _Ptr)...最后,有关构造和赋值比较重要的是被删除的两个方法: unique_ptr(const unique_ptr&) = delete; unique_ptr& operator=(const unique_ptr...unique_ptr std::unique_ptr 还有另外一个定义,即: template class unique_ptr<_
例如std::vector IntVec,使用shared_ptr方式为std::vector IntptrVec. 4、boost::shared_ptr...“ << *pA << endl; cout << “*ptr_arr = “ << *ptr_arr << endl; // 操作对象 boost::shared_ptr ptr_obj; boost...::shared_ptr ptr_MyClass(new MyClass()); ptr_obj = ptr_MyClass; ptr_obj->func(); // 智能指针避免普通指针和智能指针混用...boost::shared_ptr ptr_obj001(new MyClass()); cout << ptr_obj001.use_count() << endl; boost::shared_ptr...ptr_obj001.use_count() << endl; { // 新作用域指向同一对象,同样会自增引用计数 boost::shared_ptr ptr_obj003 = ptr_obj001;
unique_ptr与shared_ptr概览unique_ptrunique_ptr表示独占所有权的智能指针,同一时间内只能有一个unique_ptr指向给定的资源。...常见问题与易错点误用unique_ptr共享资源尝试复制unique_ptr会导致编译错误,因为它是独占所有权的。试图通过值传递或赋值方式分享unique_ptr管理的资源是错误的。...破坏循环引用使用weak_ptr:当不需要增加引用计数时,使用weak_ptr来监视shared_ptr而不增加其引用计数,可以打破潜在的循环引用。...代码示例unique_ptr示例#include void manageResource(std::unique_ptr ptr) { // 使用资源} // ptr在此处自动销毁...::move(ptr)); // 移动所有权到函数内 // ptr现在为空,资源已在manageResource内部被释放 return 0;}shared_ptr与weak_ptr示例#include
R.20: Use unique_ptr or shared_ptr to represent ownership R.20: 使用unique_ptr或者shared_ptr表示所有权 Reason...unique_ptr p2 { new X }; // unique ownership; see also ???...shared_ptr p3 { new X }; // shared ownership; see also ???...原文链接: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#r20-use-unique_ptr-or-shared_ptr-to-represent-ownership
/unique_ptr 二、特性: 也正是因为上面的原因,unique_ptr具有两个特性: 特性1: 替代raw pointer,来封装对象,进行操作,不需要考虑内存泄漏,参考官方文档。...Only non-const unique_ptr can transfer the ownership of the managed object to another unique_ptr....unique_ptr(const unique_ptr &) = delete; unique_ptr& operator=(const unique_ptr &) = delete;...unique_ptr(unique_ptr &&) noexcept; unique_ptr& operator=(unique_ptr &&) noexcept;...3.并不提供 copy 操作(这里指的是copy构造和赋值构造),这是为了防止多个unique_ptr指向同一对象。但却有一个例外:可以从函数中返回一个unique_ptr。
一、产生原因 weak_ptr的产生,主要是为了配合shared_ptr的使用,对于shared_ptr来说,有一种循环引用会导致shared_ptr的引用计数一直不能变为0,如此以来导致内存一直不能释放的掉...2.它的最大作用在于协助shared_ptr工作,像旁观者那样观测资源的使用情况。 3.weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。...2.weak_ptr可以使用一个非常重要的成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象, 从而操作资源。...#include #include int main() { std::weak_ptr w_ptr; { auto ptr...= std::make_shared(10); w_ptr = ptr; // 来查看shared_ptr的引用计数 std::cout << "w_ptr.use_count
一、产生的原因 shared_ptr的产生与unique_ptr类似,都是为了解决raw pointer的new和delete的成对使用,导致的野指针、内存泄漏、重复释放内存等。...::shared_ptr(const shared_ptr& __r) noexcept : __ptr(__r....__ptr_), __cntrl_(__r....::shared_ptr(shared_ptr&& __r) noexcept : __ptr_(__r....__ptr_), __cntrl_(__r.__cntrl) { __r.__ptr_ = 0; __r.
领取专属 10元无门槛券
手把手带您无忧上云