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

Chapter 4: Smart Pointers

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 函数就无法使用类自定义的

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

    善用shared_ptr,远离内存泄漏(文末福利)

    >("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[]。

    1.8K10

    智能指针在面试中得重要地位!

    第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 对象又保存与其相关联得控制块

    1K20

    4.2 C++ Boost 内存池管理库

    ::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时,内存泄漏就会产生。

    34020

    4.2 C++ Boost 内存池管理库

    ::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指针时计数器就会失效,导致无法正确释放资源,

    79140

    一次诡异的内存泄漏

    因为调用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也为空 下面是析构过程:

    23910

    CC++开发基础——智能指针

    智能指针除了像指针一样可以存储变量的地址,还提供了其他功能,比如可以管理动态内存分配,对引用进行计数等。 当智能指针所指向的变量离开了作用域或被重置时,智能指针会自动释放该变量所占用的堆内存资源。...10); 智能指针在初始化时,还可以用于指向动态分配的数组。...智能指针的解引用操作与原始指针类似,可以调用"*"或"->"对智能指针进行解引用,访问分配到的堆内存地址。...但是weak_ptr不提供指针的解引用操作,即无法调用"*"或"->"获得weak_ptr所指向的变量。...2.使用make functions在堆上分配资源 例如,使用std::make_unique或std::make_shared来实例化资源,然后将它包装成一个资源管理对象去管理资源以及智能指针

    32220

    C++智能指针和内存管理:使用指南和技巧

    因此,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是否已经过期,即判断其指向的对象是否已经被销毁。

    44900

    【C++】智能指针:shared_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

    2.4K20

    字节一面,轻松通过!

    std::shared_ptr 是 C++11 引入的智能指针,用于管理动态分配的对象。它允许多个指针共享对同一对象的所有权,提供了一种更安全和方便的内存管理方式,避免了内存泄漏和悬空指针的问题。.../ 共享同一个对象 std::shared_ptr ptr2 = ptr1; 动态内存管理: 使用 std::make_sharedstd::shared_ptr 的构造函数来动态分配对象...(20), deleter); 使用注意事项 避免循环引用:std::shared_ptr 可能会出现循环引用导致资源无法释放的问题。...可以使用 std::weak_ptr 来解决这个问题。 不要将裸指针std::shared_ptr 混合使用,以免发生悬空指针或重复释放的问题。...使用 std::make_shared分配动态对象,因为它能更好地管理内存。 当共享同一个资源时,确保在不再需要时及时释放智能指针

    17710

    C++ lambda 引用捕获临时对象引发 coredump 的案例

    本文介绍一类case:以基类智能指针对象的 const 引用为函数形参,并在函数内对该参数做引用捕获,然后进行跨线程异步使用。...当函数调用者使用派生类智能指针作为实参时,此时派生类智能指针对象会向上转换为基类智能指针对象,这个转换是隐式的,产生的对象是临时对象,然后被 lambda 引用捕获,后续跨线程使用引发“野引用” core.../// 是否停止工作 bool stop_ = false; /// 任务计数,用于将任务均衡分配给多线程队列 std::atomic job_cnt_ = 0; };...derive_task1 = std::make_shared(); // derive_task 会隐式转换为 BaseTask 智能指针对象, // 该对象是临时对象...上述的例子还比较容易看出来问题点,但当我们的项目代码层次较深时,这类错误就非常难看出来,也因此之前团队里的资深同事也都无法发现问题所在。

    6510

    彻底搞懂之C++智能指针

    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、智能指针只能管理堆对象,不能管理栈上对象 栈上对象本身在出栈时就会被自动销毁,如果将其指针交给智能指针

    3.7K10

    C++一分钟之-智能指针:unique_ptr与shared_ptr

    循环引用导致的内存泄漏使用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;

    71510
    领券