该指针最常用的情况是单例模式和编译防火墙的封装。 如果非要抬杠,使用 get() 函数获取到裸指针给另外一个裸指针,那么你使用智能指针的意义又何在呢?...任何智能指针都不应该去 get 裸指针使用,更不能 delete!...使用make_shared的语句更简单,因为只涉及到一个函数调用。 这样会更有效,因为库可能会对对象和智能指针进行一个分配。...make_unique 如果不需要对对象的共享访问权限,请考虑使用。 allocate_shared 如果需要为对象指定自定义分配器,请使用。 ...make_shared如果对象需要自定义删除器,则不能使用,因为无法将删除器作为参数传递。
std::make_shared std::make_unique std::allocate_shared: 它表现地和 std::make_shared 一样,除了第一个参数是用于动态内存分配的分配器对象...std::make_shared 内部和 computePriority 的执行顺序无法优化,因此可以避免动态分配的对象出现内存泄露情况 std::make_XX 函数可以产生更少更快的代码...std::shared_ptr 时,实际上执行了两次动态内存分配,一次为 Widget ,另一次为 std::shared_ptr 内部的控制块 使用 std::make_shared 函数来实现相同功能时...,实际上只执行了一次动态内存分配,一次性为 Widget 对象和控制块分配单块内存,同时减少了控制块存储的信息,也减少内存使用量 std::make_XX 函数的缺点 无法为智能指针传入自定义析构器 内部使用括号进行完美转发参数...,仅仅申请或释放和对象大小一样的内存,而实际需要的是对象大小加上控制块大小后的内存,因此使用 std::shared_ptr 构造函数不可行,而使用 std::make_shared 函数就无法使用类自定义的
>("hello");//sp1是一个智能指针 shared_ptr sp2(new int(42)); 而make_shared方式是推荐的一种,它使用一次分配,比较安全。...不要使用多个裸指针初始化多个shared_ptr 注意,下面方式是不该使用的: #include #include int main() { auto *p...而与这种情况类似的,就是使用get()获取裸指针,然后去初始化另外一个shared_ptr,或者delete get返回的指针: //来源:公众号【编程珠玑】 #include #include...*/ delete p;/*不要这样做*/ return 0; } 如果对象不是new分配的,请传递删除器 与unique_ptr类似,它可以指定删除器,默认是使用delete。...另外,shared_ptr无法直接处理数组,因为它使用delete来销毁对象,而对于数组,需要用delete[]。
std::unique_ptr 的使用比较简单,也是用得比较多的智能指针。这里直接看例子。 使用裸指针时,要记得释放内存。...{ // C++20 才支持 std::make_shared // std::shared_ptr sptr = std::make_shared<int[...image 看上面的例子,使用 std::shared_ptr 时,会涉及两次内存分配:一次分配共享资源对象;一次分配控制块。...C++ 标准库提供了 std::make_shared 函数来创建一个 shared_ptr 对象,只需要一次内存分配。 ?...::bad_weak_ptr' what(): bad_weak_ptr 小结 智能指针,本质上是对资源所有权和生命周期管理的抽象: 当资源是被独占时,使用 std::unique_ptr 对资源进行管理
第4章 智能指针 //智能指针式对裸指针进行包装,避免很对再使用裸指针时会遇到陷阱,为管理动态分配对象的生命周期设计 //通过保证这样的对象在适当的时机以适当的方式析构来防止内存泄漏。...,替代手法是使用 std::make_shared,但是使用了自定义析构器,无法用std::make_shared 2,如果必须将一个裸指针传递给std::shared_ptr的构造函数,直接传递 new...和std::make_shared, 而非直接使用 new //结论:相对于直接使用 new 表达式,优先选用 make 系列函数 //C++11 std::make_shared //C++14 std...computePriority()); /* 因为:不管哪个先被调用,总能析构掉 1, std::make_shared首先被调用,指涉到动态分配得 Wiget得裸指针会在 computePriority...,还要为与其相关联得控制块再进行一次内存分配 auto spwww = std::make_shared(); //一次内存分配,分配单块内存即保存 Widget 对象又保存与其相关联得控制块
可以使用 std::make_shared 创建对象并返回一个 std::shared_ptr。 适用于共享资源的情况,例如多个对象需要访问同一块内存。...可以使用 std::make_unique 创建对象并返回一个 std::unique_ptr。 适用于独占资源的情况,例如动态分配的对象。...::shared_ptr 适用于多个智能指针需要共享同一块内存的情况 / 可以使用 std::make_shared 创建对象并返回一个 std::shared_ptr / 跟踪引用计数 std::unique_ptr...用法 3.1 std::shared_ptr:共享指针 std::shared_ptr 是 C++ 标准库中的一个智能指针,用于管理动态分配的对象的生命周期。...std::make_shared 是一个创建 std::shared_ptr 的便捷函数,它分配内存并返回一个智能指针。
::system("pause"); return 0;}2.3 使用SharedPtr智能指针boost::shared_ptr是Boost库中的一个智能指针,用于自动管理动态分配的内存。...2.4 使用MakeShared工厂函数boost::make_shared是一个工厂函数,用于动态分配一个对象并返回一个智能指针,它是Boost库中的一个组件。...使用make_shared我们可以将对象的构造和内存分配合并在一起,避免了常规构造函数和动态内存分配的性能损失和代码冗余。...通常开发中,自己编写的工厂类都会在堆上使用new动态分配对象,然后返回对象指针,当忘记释放delete时,内存泄漏就会产生。...p->print(); std::system("pause"); return 0;}有时候代码中可能会出现循环引用的情况,此时使用shared_ptr指针时计数器就会失效,导致无法正确释放资源,
::system("pause"); return 0; } 2.3 使用SharedPtr智能指针 boost::shared_ptr是Boost库中的一个智能指针,用于自动管理动态分配的内存。...2.4 使用MakeShared工厂函数 boost::make_shared是一个工厂函数,用于动态分配一个对象并返回一个智能指针,它是Boost库中的一个组件。...使用make_shared我们可以将对象的构造和内存分配合并在一起,避免了常规构造函数和动态内存分配的性能损失和代码冗余。...make_shared()函数,用于消除使用new创建数据集,工厂函数常用于初始化特定的指针数据,如下所示; #include #include #include...通常开发中,自己编写的工厂类都会在堆上使用new动态分配对象,然后返回对象指针,当忘记释放delete时,内存泄漏就会产生。
因为调用make_shared函数,所以这里的_M_ptr指针也就是相当于一个空指针,然后继续看下_M_refcount(请注意_M_ptr作为参数传入)定义: template<typename _Tp...(); // L5 } 这块代码当时看了很多遍,一直不明白在没有显示分配对象内存的情况下,是如何使用placement new的,直至今天上午,灵光一闪,突然明白了,且听慢慢道来。...) { _M_enable_shared_from_this_with(_M_ptr); } 因为是使用std::make_shared()进行创建的,所以_M_ptr为空,此时传入_M_refcount...用于表示弱引用计数•__shared_count继承于_Sp_counted_base,其内部有一个变量_M_ptr指向对象指针•__shared_ptr中存在成员变量__shared_count•使用...大小不符,引用计数等已经初始化完成)•创建shared_ptr,因为使用的make_shared初始化,所以传入的指针为空,相应的_Sp_counted_base中的_M_ptr也为空 下面是析构过程:
智能指针除了像指针一样可以存储变量的地址,还提供了其他功能,比如可以管理动态内存分配,对引用进行计数等。 当智能指针所指向的变量离开了作用域或被重置时,智能指针会自动释放该变量所占用的堆内存资源。...10); 智能指针在初始化时,还可以用于指向动态分配的数组。...智能指针的解引用操作与原始指针类似,可以调用"*"或"->"对智能指针进行解引用,访问分配到的堆内存地址。...但是weak_ptr不提供指针的解引用操作,即无法调用"*"或"->"获得weak_ptr所指向的变量。...2.使用make functions在堆上分配资源 例如,使用std::make_unique或std::make_shared来实例化资源,然后将它包装成一个资源管理对象去管理资源以及智能指针
假设程序的设计错误导致这部分 内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak。...以下是 make_shared 的一些关键点: 功能 make_shared 用于创建一个 std::shared_ptr 对象,该对象管理动态分配的对象。...性能优化:make_shared 通常比直接使用 new 分配内存再包装成 shared_ptr 更高效。...这是因为 make_shared 只需要在堆上分配一次内存,即同时为对象本身和共享的引用计数(控制块)分配空间。...当需要指定自定义的删除器时,使用 std::allocate_shared 而不是 make_shared。
std::shared_ptr 是 C++11 引入的智能指针,用于管理动态分配的对象。它允许多个指针共享对同一对象的所有权,提供了一种更安全和方便的内存管理方式,避免了内存泄漏和悬空指针的问题。.../ 共享同一个对象 std::shared_ptr ptr2 = ptr1; 动态内存管理: 使用 std::make_shared 或 std::shared_ptr 的构造函数来动态分配对象...(20), deleter); 使用注意事项 避免循环引用:std::shared_ptr 可能会出现循环引用导致资源无法释放的问题。...可以使用 std::weak_ptr 来解决这个问题。 不要将裸指针和 std::shared_ptr 混合使用,以免发生悬空指针或重复释放的问题。...使用 std::make_shared 来分配动态对象,因为它能更好地管理内存。 当共享同一个资源时,确保在不再需要时及时释放智能指针。
因此,C++中引入了智能指针这一概念,以更好地管理内存。 什么是智能指针? 在C++中,内存的分配和释放都是由开发者手动实现的。...shared_ptr的使用方法和unique_ptr类似,只需要将所需管理的对象传递给shared_ptr即可。需要注意的是,shared_ptr不能管理动态分配的数组,因为它无法确定数组的长度。 ... sp1(new int(10)); std::cout << "sp1: " << *sp1 << std::endl; // 使用make_shared函数创建shared_ptr...对象 auto sp2 = std::make_shared(20); std::cout << "sp2: " << *sp2 << std::endl; ...shared_ptr不能管理动态分配的数组,因为它无法确定数组的长度。 在使用weak_ptr的lock()函数之前,需要判断weak_ptr是否已经过期,即判断其指向的对象是否已经被销毁。
一、产生的原因 shared_ptr的产生与unique_ptr类似,都是为了解决raw pointer的new和delete的成对使用,导致的野指针、内存泄漏、重复释放内存等。...特性2: 共享,使用shared_ptr的指针可以共享同一块内存中的数据。...思想是:该类型智能指针在实现上采用的是引用计数机制,即便有一个 shared_ptr 指针放弃了堆内存的“使用权”(引用计数减 1),也不会影响其他指向同一堆内存的 shared_ptr 指针(只有引用计数为...delete p; }); } } 输出: constructor with no managed object 1 // shared_ptr 默认构造函数分配的是空指针...= std::make_shared (10); // same as: make_shared是推荐的用法,因为它会一次性将raw pointer和引用计数的内存同时分配好 std
本文介绍一类case:以基类智能指针对象的 const 引用为函数形参,并在函数内对该参数做引用捕获,然后进行跨线程异步使用。...当函数调用者使用派生类智能指针作为实参时,此时派生类智能指针对象会向上转换为基类智能指针对象,这个转换是隐式的,产生的对象是临时对象,然后被 lambda 引用捕获,后续跨线程使用引发“野引用” core.../// 是否停止工作 bool stop_ = false; /// 任务计数,用于将任务均衡分配给多线程队列 std::atomic job_cnt_ = 0; };...derive_task1 = std::make_shared(); // derive_task 会隐式转换为 BaseTask 智能指针对象, // 该对象是临时对象...上述的例子还比较容易看出来问题点,但当我们的项目代码层次较深时,这类错误就非常难看出来,也因此之前团队里的资深同事也都无法发现问题所在。
shared_ptr 采用引用计数的智能指针。 如果你想要将一个原始指针分配给多个所有者(例如,从容器返回了指针副本又想保留原始指针时),请使用该指针。...使用shared_ptr: { std::shared_ptr sObj = std::make_shared(1); testObject(*...unique_ptr 是一个独享所有权的智能指针,它提供了严格意义上的所有权,包括: 1、拥有它指向的对象 2、无法进行复制构造,无法进行复制赋值操作。即无法使两个unique_ptr指向同一个对象。...如果函数使用new分配内存,并返还指向该内存的指针,将其返回类型声明为unique_ptr是不错的选择。这样,所有权转让给接受返回值的unique_ptr,而该智能指针将负责调用delete。...} }; std::shared_ptr e = std::make_shared(); 5、智能指针只能管理堆对象,不能管理栈上对象 栈上对象本身在出栈时就会被自动销毁,如果将其指针交给智能指针
循环引用导致的内存泄漏使用shared_ptr时,如果不小心形成了循环引用(两个或多个shared_ptr互相引用形成闭环),即使所有指向它们的普通引用都已消失,它们的引用计数也不会降为零,从而导致资源无法释放...重新设计数据结构:避免不必要的相互引用,或使用其他设计模式(如观察者模式)来替代直接的相互持有。明智地转换裸指针在将裸指针转换为智能指针之前,确保该指针未被其他智能指针管理。...使用make_shared来创建shared_ptr,以减少潜在的内存分配次数和提高效率。...代码示例unique_ptr示例#include void manageResource(std::unique_ptr ptr) { // 使用资源} // ptr在此处自动销毁...node1 = std::make_shared(); auto node2 = std::make_shared(); node1->next = node2;
std::thread 在 #include 头文件中声明,因此使用 std::thread 时需要包含 #include 头文件。...,使用std::lock_guard。...函数使用最安全的分配和使用动态内存的方法是调用一个名为make_shared的标准库函数。...此函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。当要用make_shared时,必须指定想要创建的对象的类型,定义方式与模板类相同。...make_shared 创建空对象 std::shared_ptr<int> p1 = std::make_shared<int>(); *p1 = 78; std::cout
1.1 std::shared_ptr std::shared_ptr包装了new操作符动态分配的内存,可以自由拷贝复制,基本上是使用最多的一个智能指针类型。...}; int main() { std::shared_ptr p1 = std::make_shared(); std::cout << "1 ref:" <...return 0; } 结果如下: Test() 1 ref:1 2 ref:2 3 ref:1 ~Test() 针对代码解读如下: std::make_shared里面调用了new操作符分配内存;...TestA的智能指针 }; int main() { std::shared_ptr ptr_a = std::make_shared(); std::shared_ptr... ptr_a = std::make_shared(); std::shared_ptr ptr_b = std::make_shared
(ptr[x] == nullptr) cout << "分配空间失败" << endl; } // 分别对内存空间赋值 for (int x = 0; x < 10; x++) *...< &ptr[x] << " 数值: " << *ptr[x] << endl; } getchar(); return 0; } objectPool 内存池: 该内存池支持对结构体,对象的分配与初始化...: " size() << endl; // 拷贝构造的使用 boost::shared_ptr shared_ptr...工厂函数: 工厂函数常用于初始化特定的指针数据的。...(); q->f(); q->g(); getchar(); return 0; } weak_ptr : 配合shared_ptr 作用在于协助shared_ptr 像旁观者一样观察资源的使用情况
领取专属 10元无门槛券
手把手带您无忧上云