首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Example】C++ 标准库智能指针 unique_ptrshared_ptr

现代 C + + 编程中,标准库包含智能指针,智能指针可处理对其拥有的内存分配删除,这些指针用于帮助确保程序不会出现内存资源泄漏,并具有异常安全。...该对象在其构造函数中创建或接收新分配资源,并在其析构函数中将此资源删除。 RAII 原则可确保当所属对象超出范围时,所有资源都能正确返回到操作系统。...==================================== unique_ptr unique_ptr 类型智能指针设计上最显著特点是内部托管指针一旦被创建就不能被任何形式复制给另一个...(argument); 使用make_shared作为创建对象简单、更高效方法,以及一个shared_ptr来同时管理对对象共享访问。...语义上,这两个语句是等效。但是,第一条语句进行了两个分配,如果在shared_ptr对象分配成功后,Example分配失败,则未命名Example对象将被泄漏。

98020

c++智能指针理解与简易实现

总结下个人对智能指针理解,手写一个简易c++实现,最后整理一下相关知识点,有不准确部分欢迎大佬指正。...智能指针利用c++ RAII特性模板化编程,本质上是一个包装类,使用起来像普通指针一样方便。当最后一个引用动态对象智能指针离开作用域或不在引用动态对象后对其进行清理。...而shared_ptr尺寸是裸指针二倍,同时还有控制块开销,相比较unique_ptr要更占空间。实际c++标准库也是如此,共享指针更占用资源。...考虑一种情况:如果一个函数同时出现了unique_ptrunique_ptr重载,并且尝试通过隐式转换调用,那么编译器无法推测应该转换为哪种类型。...shared_ptr可以由unique_ptr右值引用构造,所以对象工厂函数如果不确定所有权的话可以一律使用unique_ptr返回

73800
您找到你想要的搜索结果了吗?
是的
没有找到

【笔记】《C++Primer》—— 第12章:动态内存

,标准库头文件memory中定义了两个智能指针:允许多个指针指向同个对象shared_ptr,指针独占对象unique_ptr,还有一个伴随弱引用指针weak_ptr。...容器类类似,智能指针也是模板类 12.1.1-12.1.4 shared_ptr 通常讲到C++智能指针就是指shared_ptr,其操作如下 ?...(new int(2)); 我们不可以对unique_ptr进行拷贝赋值,但是我们可以用releasereset函数来转移它所有权,release会放弃当前指针所有权并返回其内部指针,reset...则智能指针一样类似于赋值 尽管我们不能拷贝unique_ptr但是我们可以拷贝赋值一个即将销毁unique_ptr,最常见函数返回时使用 我们同样可以像shared_ptr那样自定义指针删除器...,expired等函数存在意义 12.2 动态数组 我们都知道用new方括号可以申请一大块连续内存用于初始化一个对象数组,返回值是指向这个数组第一个元素指针 注意由于返回终究是个指针所以我们不能对其使用

46710

窥见C++11智能指针

导语: C++指针内存管理相信是大部分C++入门程序员梦魇,受到Boost启发,C++11标准推出了智能指针,让我们从指针内存管理中释放出来,几乎消灭所有newdelete。...(函数参数返回值例外),这一定程度避免了一些误操作导致指针所有权转移,然而,unique_str依然有提供所有权转移方法move,调用move后,原unique_ptr就会失效,再用其访问裸指针也会发生...Objective-C嫌疑),实现对同一块内存可以有多个引用,最后一个引用被释放时,指向内存才释放,这也是unique_ptr最大区别。...>sp1(new int(10)); // 使用make_shared,推荐做法,更符合工厂模式,可以连代码中所有new,更高效;方法参数是用来初始化模板类shared_ptrsp2 =...因此,智能指针就是利用这一性质,通过一个栈上对象(shared_ptrunique_ptr)来管理一个堆上对象(裸指针),shared_ptrunique_ptr析构函数中判断当前裸指针引用计数情况来决定是否释放裸指针

1.4K20

C++ 动态内存

c++内存上我碰到很多很多坑~,特此来记一笔。...局部static对象只第一次使用前进行分配,程序结束时销毁。 但是除了自动static对象之外,C++还支持动态分配对象。...当用一个shared_ptr初始化另外一个shared_ptr时 2.当作为实参传入到一个函数时 3. 当作为函数返回值时。 ? 减1情况: 1....我们推荐使用make_shared而不是采用new方式,这是因为采用make_shared方式能在分配对象同时就讲shared_ptr与内存进行绑定,避免了无意中将同一块内存绑定到多个独立创建shared_ptr...不能拷贝unique_ptr规则但是有一个例外,可以拷贝或赋值一个将要被销毁unique_ptr,主要是传递unique_ptr返回unique_ptr。 ? ?

80120

初探C++11智能指针

(函数参数返回值例外),这一定程度避免了一些误操作导致指针所有权转移,然而,unique_str依然有提供所有权转移方法move,调用move后,原unique_ptr就会失效,再用其访问裸指针也会发生...C++中,创建数组有很多方法,如下所示: // 静态数组,在编译时决定了数组大小 int arr[10]; // 通过指针创建在堆上数组,可在运行时动态指定数组大小,但需要手动释放内存 int...Objective-C嫌疑),实现对同一块内存可以有多个引用,最后一个引用被释放时,指向内存才释放,这也是unique_ptr最大区别。...sp1(new int(10)); // 使用make_shared,推荐做法,更符合工厂模式,可以连代码中所有new,更高效;方法参数是用来初始化模板类 shared_ptr...因此,智能指针就是利用这一性质,通过一个栈上对象(shared_ptrunique_ptr)来管理一个堆上对象(裸指针),shared_ptrunique_ptr析构函数中判断当前裸指针引用计数情况来决定是否释放裸指针

1.2K30

STL四种智能指针

它持有对对象独有权——两个unique_ptr不能指向一个对象,即unique_ptr不共享它所管理对象。...如果psvocation是常规指针,则两个指针将指向同一个string对象。这是不能接受,因为程序将试图删除同一个对象两次,一次是ps过期时,另一次是vocation过期时。...要避免这种问题,方法有多种: (1)定义陚值运算符,使之执行深复制。这样两个指针将指向不同对象,其中一个对象是另一个对象副本,缺点是浪费空间,所以智能指针都未采用此方案。...当一个man一个woman是夫妻时候,他们直接就存在了相互引用问题。man内部有个用于管理wife生命期shared_ptr变量,也就是说wife必定是husband去世之后才能去世。...创建shared_ptr方法就是lock()方法。 注意:shared_ptr实现了operator bool() const方法来判断一个管理资源是否被释放。

2.7K41

C++智能指针

原来类中有一个指针指向辅助类对象,辅助类数据成员是一个计数器一个指针(指向原来对象)。 可见,第三种方法是优先选择方法,智能指针实现引用计数策略主要有两种:辅助类与句柄类。...它持有对对象独有权——两个unique_ptr不能指向一个对象,即unique_ptr不共享它所管理对象。...要避免这种问题,方法有多种: (1)定义陚值运算符,使之执行深复制。这样两个指针将指向不同对象,其中一个对象是另一个对象副本,缺点是浪费空间,所以智能指针都未采用此方案。...当一个man一个woman是夫妻时候,他们直接就存在了相互引用问题。man内部有个用于管理wife生命期shared_ptr变量,也就是说wife必定是husband去世之后才能去世。...unique_ptr为右值时,可将其赋给shared_ptr,这与将一个unique_ptr赋给另一个unique_ptr需要满足条件相同,即unique_ptr必须是一个临时对象。

3.5K30

Chapter 4: Smart Pointers

通用例子是将 std::unique_ptr 作为返回层次结构中对象工厂函数返回类型,对于这样一个层次结构,工厂函数通常在堆上分配一个对象,然后返回指向该对象指针,而工厂函数调用者则负责使用完对象后...,比如,当从工厂函数返回 std::unique_ptr 被移动到一个容器中,而这个容器后来又被移动到一个对象数据成员中。...,这个引用计数就加 1 (通常情况),每析构一个指向 a std::shared_ptr ,这个引用计数就减 1 ,拷贝赋值时,两者都会执行(指针 a b 指向两个不同对象,那么 a = b...,因为多个使用者可能并发读写该引用计数 构造 std::shared_ptr 移动构造情况下,不会对引用计数进行修改 std::shared_ptr 自定义析构器 std::unique_ptr...,现在有一个工厂函数基于一个唯一 ID 来产生指向只读对象智能指针,返回一个 std::shared_ptr std::shared_ptr loadWidget

1.6K20

C++智能指针unique_ptrshared_ptrweak_ptr

C++智能指针是一种特殊指针类型,它能够自动管理内存资源,避免常见内存泄漏多次释放等问题。C++11引入了三种主要智能指针:unique_ptrshared_ptrweak_ptr。...①unique_ptr C++中,unique_ptr一个智能指针(smart pointer)类模板,用于管理动态分配内存资源,它提供了自动释放内存功能。...②shared_ptr C++中,shared_ptr一个智能指针(smart pointer)类模板,用于管理动态分配内存资源。...循环引用问题 循环引用问题指的是使用shared_ptr管理对象时,存在两个或多个对象相互持有shared_ptr,形成一个循环引用情况。...当这两个对象生命周期延长,超过了程序实际需要它们时间时,就会造成循环引用内存泄露。 为了解决循环引用问题,C++中引入了弱引用指针weak_ptr。

47620

智能指针详解

return 0; } 多线程下对象析构问题 多线程环境下,对象析构问题需要特别注意,因为多个线程可能同时访问操作同一个对象。如果多个线程同时尝试析构同一个对象,可能会导致对象被多次删除。...智能指针封装了指向堆分配对象原始指针,因此智能指针通常提供直接访问其原始指针方法C++ 标准库智能指针拥有一个用于此目的get成员函数。...C++11主要支持智能指针为以下几种: unique_ptr shared_ptr weak_ptr unique_ptr std::unique_ptrC++ 标准库提供智能指针之一...它本身是一个弱指针,所以它本身是不能直接调用原生指针方法。如果想要使用原生指针方法,需要将其先转换为一个std::shared_ptr。 weak_ptr可以通过一个shared_ptr创建。...cnt = weak_a1.use_count(); /* lock()返回shared_ptr,如果原生指针没有被释放, 则返回一个非空shared_ptr,否则返回一个shared_ptr

21440

一个合格C++程序员,应该善用智能指针!

今天我们来聊一聊C++智能指针。 在谈到学习C++时,好多人都说它特别难,说它复杂。很可能有一部分原因就是C++内存管理,程序运行过程中很容易就会出现内存泄漏。...线程安全性: std::shared_ptr 多线程环境下是线程安全,可以被多个线程同时访问操作,不需要额外同步机制。...然后,我们创建了另一个 std::shared_ptr,与第一个 std::shared_ptr 共享同一块内存。这意味着两个 std::shared_ptr 对象共享同一个计数器同一块内存。...检查是否有效: 可以使用 std::weak_ptr expired() 方法来检查与之关联资源是否有效。如果资源已经释放,则 expired() 返回 true,否则返回 false。...如果资源仍然有效,则 lock() 返回一个有效 std::shared_ptr;如果资源已经释放,则返回一个 std::shared_ptr

11610

【C++11】 使用C++11解决内存泄露--智能指针

众所周知,C#java中不需要开发人员自己释放内存,对象引用计数为零后.NetJava虚拟机会对对象进行自动回收,从而防止内存泄露;但是C++语言中,堆上分配内存必须自己去管理,不用时候要自己释放...实际编程时,有三种智能指针可供使用,分别是:std::shared_ptr、std::unique_ptrstd::weak_ptr。...如果函数要返回this指针时,不要将this当做智能共享指针进行返回。因为如果使用同一个指针(this)构造了两个对象,析构时可能导致重复析构。...弱指针除了上面描述功能外,shared_ptr返回this指针实现中也是使用了弱指针方法才得以实现,同理,解决循环引用问题时,只需要将两个类中任意一个成员使用弱指针,循环引用导致内存泄露问题都可以顺利解决...,只做监控使用,用于解决shared_ptrthis指针返回问题循环引用计数问题。

64710

【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针

可以资源(原生指针对应对象)生命周期结束时自动释放内存。C++标准库中,提供了两种最常见智能指针类型,分别是std::unique_ptr std::shared_ptr。...创建unique_ptr对象我们可以std::unique_ptr构造函数或std::make_unique函数(C++14支持)来创建一个unique_ptr对象,超出作用域时,会自动释放所管理对象内存... reset 方法中,需要减少计数器值,如果计数器减少后为 0,则需要释放管理资源,如果减少后不为0,则不会释放之前资源对象。...我们可以通过weak_ptrlock()方法来获得一个指向共享对象shared_ptr。如果weak_ptr已经失效,lock()方法返回一个shared_ptr。...所以shared_ptr析构时,将该指针指向对象给释放掉了,导致指针`q`变成一个悬空指针。

27900

C++智能指针用法

智能指针 智能指针是一种C++中用于管理动态分配内存工具,它们提供了更安全方便方式来管理内存资源,以避免内存泄漏资源管理错误。...我们访问了这两个智能指针,然后释放了一个智能指针资源。最后检查了引用计数以验证资源释放。这个示例展示了 std::shared_ptr 如何自动管理资源,确保资源不再需要时被正确释放。...3.2 std::unique_ptr:唯一指针 std::unique_ptrC++ 标准库中一个智能指针类,用于管理动态分配对象,但与 std::shared_ptr 不同,std::...lock() 方法,可以尝试将其转换为一个有效 std::shared_ptr。...如果 std::weak_ptr 指向对象仍然存在,lock() 将返回一个有效 std::shared_ptr,否则返回一个 std::shared_ptr。 4.

10910

详解C++11智能指针

前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用。...C++ 11中最常用智能指针类型为shared_ptr,它采用引用计数方法,记录当前内存资源被多少个智能指针引用。该引用计数内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减一。...C++一个标准库函数std::move(),让你能够将一个unique_ptr赋给另一个。尽管转移所有权后 还是有可能出现原有指针调用(调用就崩溃)情况。...放弃内部对象所有权或拥有对象变更, 会引起原有对象引用计数减少 get 返回内部对象(指针), 由于已经重载了()方法, 因此直接使用对象是一样.如 shared_ptr sp(new...如果 expired 为 true, 返回一个 shared_ptr; 否则返回一个 shared_ptr, 其内部对象指向与 weak_ptr 相同. use_count 返回shared_ptr

1.5K40

Modern C++ 最核心变化是什么?

不严格来说,左值对应变量存储位置,而右值对应变量值本身。C++ 中右值可以被赋值给左值或者绑定到引用。类右值是一个临时对象,如果没有被绑定到引用,表达式结束时就会被废弃。...拷贝 std::shared_ptr 需要线程同步,相比之下移动 std::shared_ptr 是非常轻松愉快。 2.按值返回 接收输入参数一样,返回值按值返回也是最符合人类思维方式。... unique_ptr(new SomeObj(/*...*/)); } 工厂类中,这样语义是非常常见。...返回 unique_ptr 能够明确对所构造对象所有权转移,特别的,这样工厂返回值可以被忽略而不会造成内存泄露。...上面两种形式分别返回栈上左值右值,但都适用移动语义(unique_ptr 不支持拷贝)。

95721

C++智能指针原理实现

一、智能指针起因   C++中,动态内存管理是由程序员自己申请和释放,用一对运算符完成:newdelete。   ...new:动态内存中为对象分配一块空间并返回一个指向该对象指针;   delete:指向一个动态独享指针,销毁对象,并释放与之关联内存。   ...:替换所管理对象;   (4) use_count:返回shared_ptr所指对象引用计数;   (5) operator*operator->:解引用存储对象指针;   (6) operator...不能使用类似这样形式 shared_ptr p = new int;   (2) 避免循环引用,这是shared_ptr一个最大陷阱,导致内存泄漏,这一点weak_ptr中将得到完善;...:shared_ptr;   4.当你需要一个能访问资源,但不控制其生命周期指针,请使用std::weak_ptr;   5.不能把一个原生指针交给两个智能指针对象管理。

51730

C++ 智能指针最佳实践&源码分析

先以一个常见 C++多线程问题为例,介绍多线程下对象析构问题。 比如我们开发过程中,经常会在一个 Class 中创建一个线程,这个线程读取外部对象成员变量。...如果A想要调用BC方法怎么办呢?可否A中定义BCshared_ptr呢?答案是不可以,这样会产生循环引用,导致内存泄露。 此时就需要weak_ptr出场了。...根据栈上分配特性,离开作用域后,会自动调用其析构方法。智能指针根据这个特性实现了对象内存管理自动释放。...指针特性两个方法。...先看下shared_ptr声明。shared_ptr主要有两个成员变量,一个是原生指针,一个是控制块指针,用来存储这个原生指针shared_ptrweak_ptr数量。

1.6K31
领券