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

【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

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

1.1K20

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

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

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

    【笔记】《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进行拷贝和赋值,但是我们可以用release和reset函数来转移它的所有权,release会放弃当前指针的所有权并返回其内部的指针,reset...则和智能指针一样类似于赋值 尽管我们不能拷贝unique_ptr但是我们可以拷贝和赋值一个即将销毁的unique_ptr,最常见的是在函数返回时使用 我们同样可以像shared_ptr那样自定义指针的删除器...,expired等函数存在的意义 12.2 动态数组 我们都知道用new和方括号可以申请一大块连续内存用于初始化一个对象数组,返回值是指向这个数组第一个元素的指针 注意由于返回的终究是个指针所以我们不能对其使用

    49610

    窥见C++11智能指针

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

    82220

    初探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_ptr或unique_ptr)来管理一个堆上的对象(裸指针),在shared_ptr或unique_ptr的析构函数中判断当前裸指针的引用计数情况来决定是否释放裸指针

    1.3K30

    C++ —— 以真我之名 如飞花般绚丽 - 智能指针

    两个指针不能指向同一个资源 2. 不能进行左值unique_ptr复制构造和左值复制赋值操作,但可以临时右值赋值构造和赋值 3....,可以调用lock返回⼀个管理资源的shared_ptr lock:在资源还没有释放之前,再产生一个shared_ptr去管理资源 如果资源已经被释放,返回的shared_ptr是⼀个空对象...> up1(new Date[10]); shared_ptr sp1(new Date[10]); 方法1 临时的解决方法:因为new[]经常使⽤,所以unique_ptr和shared_ptr...和shared_ptr⽀持删除器的⽅式有所不同 :unique_ptr是在类模板参数⽀持的,shared_ptr是构造函数参数⽀持的 2....C++ TR1,引⼊了shared_ptr等,不过注意的是TR1并不是标准版 5. C++ 11,引⼊了unique_ptr和shared_ptr和weak_ptr。

    9710

    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_ptr不能指向一个对象,即unique_ptr不共享它的所管理的对象。...要避免这种问题,方法有多种: (1)定义陚值运算符,使之执行深复制。这样两个指针将指向不同的对象,其中的一个对象是另一个对象的副本,缺点是浪费空间,所以智能指针都未采用此方案。...当一个man和一个woman是夫妻的时候,他们直接就存在了相互引用问题。man内部有个用于管理wife生命期的shared_ptr变量,也就是说wife必定是在husband去世之后才能去世。...在unique_ptr为右值时,可将其赋给shared_ptr,这与将一个unique_ptr赋给另一个unique_ptr需要满足的条件相同,即unique_ptr必须是一个临时的对象。

    3.5K30

    STL四种智能指针

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

    2.7K41

    智能指针:从基础、使用选择到原理

    std::unique_ptr的特性和使用std::unique_ptr是一种独占所有权的智能指针,它禁止共享其指向的对象。这意味着在任何时候,只能有一个std::unique_ptr指向给定的对象。...例如,假设我们有两个类A和B,它们互相包含对方的std::shared_ptr:class B;class A {public: std::shared_ptr b_ptr;};class...在大多数情况下,你应该默认使用std::unique_ptr,除非你知道你需要一个std::shared_ptr。这是因为std::unique_ptr更轻量,而且不需要额外的计数开销。...在这种情况下,我们应该返回一个std::unique_ptr,因为工厂创建的每个小部件都是唯一的,不应该被共享。...智能指针的底层实现原理智能指针的底层实现原理主要依赖于两个C++特性:模板和析构函数。模板:智能指针是模板类,可以接受任何类型的原始指针。

    9200

    C++的智能指针unique_ptr、shared_ptr和weak_ptr

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

    1.1K20

    一个合格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。

    19710

    智能指针详解

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

    34340

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

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

    72010

    【重学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_ptr的lock()方法来获得一个指向共享对象的shared_ptr。如果weak_ptr已经失效,lock()方法将返回一个空的shared_ptr。...所以在shared_ptr析构时,将该指针指向的对象给释放掉了,导致指针`q`变成一个悬空指针。

    43600

    C++智能指针的用法

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

    14210

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

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

    99921

    C++智能指针原理和实现

    一、智能指针起因   在C++中,动态内存的管理是由程序员自己申请和释放的,用一对运算符完成:new和delete。   ...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.不能把一个原生指针交给两个智能指针对象管理。

    55730
    领券