在现代 C + + 编程中,标准库包含智能指针,智能指针可处理对其拥有的内存的分配和删除,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。...该对象在其构造函数中创建或接收新分配的资源,并在其析构函数中将此资源删除。 RAII 原则可确保当所属对象超出范围时,所有资源都能正确返回到操作系统。...==================================== unique_ptr unique_ptr 类型智能指针在设计上最显著的特点是内部托管的指针一旦被创建就不能被任何形式的复制给另一个...(argument); 使用make_shared作为创建对象的简单、更高效的方法,以及一个shared_ptr来同时管理对对象的共享访问。...在语义上,这两个语句是等效的。但是,第一条语句进行了两个分配,如果在shared_ptr对象的分配成功后,Example的分配失败,则未命名的Example对象将被泄漏。
总结下个人对智能指针的理解,手写一个简易的c++实现,最后整理一下相关知识点,有不准确的部分欢迎大佬指正。...智能指针利用c++ RAII的特性和模板化编程,本质上是一个包装类,使用起来像普通指针一样方便。当最后一个引用动态对象的智能指针离开作用域或不在引用动态对象后对其进行清理。...而shared_ptr的尺寸是裸指针的二倍,同时还有控制块的开销,相比较unique_ptr要更占空间。实际的c++标准库也是如此,共享指针更占用资源。...考虑一种情况:如果一个函数同时出现了unique_ptr和unique_ptr的重载,并且尝试通过隐式转换调用,那么编译器无法推测应该转换为哪种类型。...shared_ptr可以由unique_ptr右值引用构造,所以对象的工厂函数如果不确定所有权的话可以一律使用unique_ptr返回。
,标准库在头文件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和方括号可以申请一大块连续内存用于初始化一个对象数组,返回值是指向这个数组第一个元素的指针 注意由于返回的终究是个指针所以我们不能对其使用
在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。 ? ?
导语: 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的析构函数中判断当前裸指针的引用计数情况来决定是否释放裸指针
(函数的参数和返回值例外),这一定程度避免了一些误操作导致指针所有权转移,然而,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的析构函数中判断当前裸指针的引用计数情况来决定是否释放裸指针
还有一个例子,Java 中往容器中放对象,实际放入的是引用,不是真正的对象,而 C++ 在 vector 中 push_back 采用的是值拷贝。...C++ 标准一共有四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr。其中 auto_ptr 在 C++11 已被摒弃,C++17 中被移除不可用了。...在执行完 objPtr2 = objPtr1 赋值后,objPtr1 和 objPtr2 两个指针都将指向同一个 Object 对象。...shared_ptr 和 weak_ptr shared_ptr 是目前工程内使用最多最广泛的智能指针,它使用引用计数实现对同一块内存的多个引用,在最后一个引用被释放时,指向的内存才释放,这也是和 unique_ptr...,那么 lock() 返回一个空的 shared_ptr。
它持有对对象的独有权——两个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方法来判断一个管理的资源是否被释放。
通用的例子是将 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
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。
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
原来的类中有一个指针指向辅助类对象,辅助类的数据成员是一个计数器和一个指针(指向原来的对象)。 可见,第三种方法是优先选择的方法,智能指针实现引用计数的策略主要有两种:辅助类与句柄类。...它持有对对象的独有权——两个unique_ptr不能指向一个对象,即unique_ptr不共享它的所管理的对象。...要避免这种问题,方法有多种: (1)定义陚值运算符,使之执行深复制。这样两个指针将指向不同的对象,其中的一个对象是另一个对象的副本,缺点是浪费空间,所以智能指针都未采用此方案。...当一个man和一个woman是夫妻的时候,他们直接就存在了相互引用问题。man内部有个用于管理wife生命期的shared_ptr变量,也就是说wife必定是在husband去世之后才能去世。...在unique_ptr为右值时,可将其赋给shared_ptr,这与将一个unique_ptr赋给另一个unique_ptr需要满足的条件相同,即unique_ptr必须是一个临时的对象。
今天我们来聊一聊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。
众所周知,C#和java中不需要开发人员自己释放内存,对象引用计数为零后.Net和Java虚拟机会对对象进行自动回收,从而防止内存泄露;但是C++语言中,在堆上分配的内存必须自己去管理,不用的时候要自己释放...在实际编程时,有三种智能指针可供使用,分别是:std::shared_ptr、std::unique_ptr和std::weak_ptr。...如果函数要返回this指针时,不要将this当做智能共享指针进行返回。因为如果使用同一个指针(this)构造了两个对象,析构时可能导致重复析构。...弱指针除了上面描述的功能外,在shared_ptr返回this指针的实现中也是使用了弱指针的方法才得以实现,同理,在解决循环引用的问题时,只需要将两个类中的任意一个类的成员使用弱指针,循环引用导致的内存泄露问题都可以顺利解决...,只做监控使用,用于解决shared_ptr的this指针返回问题和循环引用计数问题。
可以在资源(原生指针对应的对象)生命周期结束时自动释放内存。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`变成一个悬空指针。
智能指针 智能指针是一种在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.
一、智能指针起因 在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.不能把一个原生指针交给两个智能指针对象管理。
前言 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
先以一个常见的 C++多线程问题为例,介绍多线程下的对象析构问题。 比如我们在开发过程中,经常会在一个 Class 中创建一个线程,这个线程读取外部对象的成员变量。...如果A想要调用B和C的方法怎么办呢?可否在A中定义B和C的shared_ptr呢?答案是不可以,这样会产生循环引用,导致内存泄露。 此时就需要weak_ptr出场了。...根据栈上分配的特性,在离开作用域后,会自动调用其析构方法。智能指针根据这个特性实现了对象内存的管理和自动释放。...指针特性的两个方法。...先看下shared_ptr的声明。shared_ptr主要有两个成员变量,一个是原生指针,一个是控制块的指针,用来存储这个原生指针的shared_ptr和weak_ptr的数量。
这三种智能指针实例的区别在于,管理原始指针的方式不一样。 shared_ptr允许多个指针指向同一个变量。 unique_ptr则独占所指向的变量。...初始化方式一,在智能指针构造函数中new一个新对象。...swap(): 交换两个智能指针所管理的资源。 release(): 返回指向变量的原始指针,并释放所有权。 用法说明: reset()让unique_ptr重新指向给定的指针。...4.shared_ptr智能指针 常用的成员函数: get(): 返回指向变量的原始指针。 reset(): 重置智能指针,使它所持有的资源为空。 swap(): 交换两个智能指针所管理的资源。...std::move可以把一个智能指针所占有的资源转移给另一个智能指针。 shared_ptr包含一个显式的构造函数,可用于将右值unique_ptr转换为shared_ptr。
领取专属 10元无门槛券
手把手带您无忧上云