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

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

资源析构采用 delete 运算符来实现,但可以指定自定义删除器 // 有状态的删除器和采用函数指针实现的删除器会增加 std::unique_ptr // 别的对象尺寸 // • std::unique_ptr...p 所指堆内存的所有权(p 为 nullptr)。...*/ //情况1:std::shared_ptr也使用 delete运算符作为默认资源析构机制,同样支持自定义析构器,与 std::unique_ptr不同的是,后者析构器的型别是智能指针型别的一部分,...{pw1, pw2 //但是请注意:对于具有不同自定义析构器型别的 std::unique_ptr来说,以上这些均无法实现 //因为自定义析构器的型别会影响 std::unqie_ptr的型别 //不同点...//注意自定义析构器可能是函数对象,函数对象可以包含任意数量的数据,这意味着它们的尺寸可能是任意大小 //std::shared_ptr如何能够在不使用更多内存的前提下,指涉到任意尺寸的析构器?

1K20

c++11新特性之智能指针

Print(); ClassWrapper *p = smart_ptr.get(); // 可以通过get获取裸指针 p->Print(); return 0; } 智能指针还可以自定义删除器...,在引用计数为0的时候自动调用删除器来释放对象的内存,代码如下: std::shared_ptr ptr(new int, [](int *p){ delete p; }); 关于shared_ptr...不要delete get()返回来的裸指针。 不是new出来的空间要自定义删除器。 要避免循环引用,循环引用导致内存永远不会被释放,造成内存泄漏。...std::unique_ptr是一个独占型的智能指针,它不允许其它智能指针共享其内部指针,也不允许unique_ptr的拷贝和赋值。...= ptr; // error, unique_ptr不允许移动 ptr->Print(); return 0; } unique_ptr也可以像shared_ptr一样自定义删除器,使用方法和

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

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

    内存泄露会使该部分内存资源不可用,以及同样重要的,动态对象所持有的资源无法释放。而重复释放则可能会导致程序crash。 于是智能指针应运而生,承担了删除动态对象释放内存的责任。...于是顺势就引出了所有权问题,当一个动态对象只会被一个指针引用时为独占所有权,被多个指针引用时为共享所有权。独占所有权的指针在释放时直接删除对象,共享所有权的指针则在最后一个指针释放时删除对象。...--- 浅总结一下智能指针知识点 shared_ptr一般比unique_ptr更占用内存,但是如果在unique_ptr使用自定义析构器的话,那么情况可能不同。...针对shared_ptr,工厂函数只进行一次动态内存分配,分配效率高,同时也避免了裸指针方式两次分配中间因为异常导致的内存泄露。 如下场景不适合或谨慎使用make工厂函数: 自定义析构器。...工厂函数无法自定义析构器,所以这种场景就无法使用。

    76800

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

    这意味着在任何时候只有一个unique_ptr可以指向一个特定的对象。 自动释放内存:当unique_ptr超出作用域或被重新赋值时,它所管理的内存会自动释放。这样就避免了内存泄漏的问题。...可自定义删除器:unique_ptr可以通过模板参数来指定一个删除器(deleter)函数对象,用于在释放内存时执行额外的清理操作。...通过移动构造函数将所有权转移给另一个unique_ptr std::unique_ptr ptr2 = std::move(ptr); // 注意,此时ptr已经为空指针,...不再拥有对象的所有权 std::cout std::endl; // 输出: 42 // 使用自定义删除器 struct Deleter {...unique_ptr超出作用域时会自动释放内存,同时调用自定义删除器 return 0; } 常见成员函数 operator*:解引用操作符,用于获取 unique_ptr 所指向对象的引用。

    1.1K20

    【C++高阶】:自定义删除器的全面探索

    删除器的基本概念 在C++中,智能指针(Smart Pointers)如std::unique_ptr和std::shared_ptr默认使用delete或delete[]来释放内存。...1.1 默认删除器 默认情况下,std::unique_ptr和std::shared_ptr使用以下方式进行删除: delete ptr; delete[] arr_ptr; 这些删除器在大多数情况下都很有用...1.3 为什么需要自定义删除器 1.2.1 管理非堆内存资源 除了内存,智能指针还可以用于管理其他类型的资源,例如文件句柄、互斥锁或数据库连接。这些资源可能需要特定的释放机制。...默认删除器 堆内存 简单、高效 不够灵活 函数对象(Functor) 需要状态的复杂资源管理 灵活、可维护 可能增加内存开销 Lambda表达式 简单的自定义逻辑 简洁、现代 不能携带状态 std::...std::unique_ptr或std::shared_ptr的删除器。

    19410

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

    在现代 C + + 编程中,标准库包含智能指针,智能指针可处理对其拥有的内存的分配和删除,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。...C 样式编程的一个主要 bug 类型是内存泄漏。 泄漏通常是由于为分配的内存的调用失败引起的 delete new。 现代 C++ 强调“资源获取即初始化”(RAII) 原则。 其理念很简单。...资源(堆内存、文件句柄、套接字等)应由对象“拥有”。 该对象在其构造函数中创建或接收新分配的资源,并在其析构函数中将此资源删除。...--Microsoft Docs 为了支持对 RAII 原则的简单采用,C++ 标准库提供了三种智能指针类型: std::unique_ptr std::shared_ptr std::weak_ptr...make_shared如果对象需要自定义删除器,则不能使用,因为无法将删除器作为参数传递。

    1.1K20

    C++智能指针

    这时我们会想:当remodel这样的函数终止(不管是正常终止,还是由于出现了异常而终止),函数体内的局部变量都将自动从栈内存中删除,因此指针ps占据的内存将被释放,如果ps指向的内存也被自动释放,那该有多好啊...总的来说,使用引用计数有如下两个目的: (1)节省内存,提高程序运行效率。如何很多对象拥有相同的数据实体,存储多个数据实体会造成内存空间浪费,所以最好做法是让多个对象共享同一个数据实体。... u_i2(new int(4));//创建时指定动态对象 unique_ptr u(d); //创建空unique_ptr,执行类型为T的对象,用类型为D的对象d来替代默认的删除器... p (new int[3]{1,2,3}); p[0] = 0;// 重载了operator[] (3.3)自定义资源删除操作(Deleter)。...unique_ptr默认的资源删除操作是delete/delete[],若需要,可以进行自定义: void end_connection(connection *p) { disconnect(*p);

    3.5K30

    Chapter 4: Smart Pointers

    std::unique_ptr 设置自定义析构器后, std::unique_ptr 的大小不再等于原始指针的大小 当自定义析构器是函数指针时, std::unique_ptr 的大小从 1 个字长变为...2 个字长 当自定义析构器是函数对象时, std::unique_ptr 的大小取决于函数对象内部存储多少状态,无状态函数对象(例如:无捕捉的 lambda 表达式)不会增加 std::unique_ptr...自定义的析构器区别 对于 std::unique_ptr ,自定义析构器属于 std::unique_ptr 的一部分 对于 std::shared_ptr ,自定义析构器不属于 std::unique_ptr...因为这些自定义析构器的内存和 std::shared_ptr 内存不是同一片内存 更具体的说, std::shared_ptr 包含的是一个指向对象的指针和一个指向控制块的指针,而这个控制块里面包含引用计数...,实际上只执行了一次动态内存分配,一次性为 Widget 对象和控制块分配单块内存,同时减少了控制块存储的信息,也减少内存使用量 std::make_XX 函数的缺点 无法为智能指针传入自定义析构器 内部使用括号进行完美转发参数

    1.6K20

    智能指针探究

    如果引用计数为零,那么指向的对象不再被任何CSmartPtr对象引用,因此可以安全地删除它。...因此,在使用 detach() 方法时应谨慎 自定义删除器 智能指针:能够保证资源的绝对释放,里面默认都是delete ptr释放资源的 但不是所有的资源都是能够通过delete释放的,毕竟资源那么多种类...先讲讲智能指针内部是咋回事吧 unique_ptr shared_ptr 一个不带计数,一个带计数 他们两个都是可以带自定义删除器的 看他们的源码 ~unique_ptr(){ 是一个函数对象的调用...第一个参数是指针所指向的类型,即 int。第二个参数是删除器类型,即 function。...删除器是一个函数对象,用于在智能指针销毁时释放其所指向的资源 在这段代码中,删除器是一个 lambda 表达式。lambda 表达式是一种匿名函数,它可以捕获上下文中的变量并在其函数体中使用。

    9210

    C++智能指针

    T的数组对象 unique_ptr up(); //空的unique_ptr,接受一个D类型的删除器D,使用D释放内存 unique_ptr up(new T()); //定义unique_ptr...,同时指向类型为T的对象,接受一个D类型的删除器d,使用删除器d来释放内存 删除器 利用一个仿函数实现一个删除器 class DestructTest { public: void operator...(void) { //使用自定义的删除器 unique_ptrup(new Test()); return 0; } 赋值 (接管所有权)一定要使用移动语义... sp5(new T(), D()); //定义shared_ptr,指向类型为T的对象,接受一个D类型的删除器,使用D删除器来释放内存 数组对象的管理: shared_ptr...1,p接管对p1指针的管控 up.reset(p1,d); //将up重置为p1(的值),up管控的对象计数减1并使用d作为删除器 交换 std::swap(p1,p2); //交换p1 和p2 管理的对象

    46420

    C++相关基础知识总结笔记

    这使得应用程序能够快速地利用最新的库版本,而不需要频繁地重新发布应用程序。 节省资源: 多个应用程序可以共享相同的库文件,从而节省存储空间和内存资源。...typdef 别名 typedef为C语言的关键字,作用是为一种数据类型(基本类型或自定义数据类型)定义一个新名字,不能创建新类型。...删除器:std::unique_ptr 支持自定义删除器,可以用来执行额外的清理工作,如关闭文件句柄等。...但是: 删除元素:删除当前迭代器指向的元素会使该迭代器失效。但删除操作不会影响其他迭代器的有效性。 例如,std::map::erase 会使被删除元素的迭代器失效,但不影响其他迭代器。...函数重载允许在一个作用域中定义多个同名函数,只要它们的参数列表不同即可。 运算符重载则是为已有的运算符提供自定义的行为,使其适用于用户定义的类型。

    21330

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

    每个 std::shared_ptr 对象都包含一个计数器,记录有多少个 std::shared_ptr 对象共享同一块内存。...动态分配的资源: std::shared_ptr 通常用于管理动态分配的资源,如内存、文件句柄等。它不仅可以管理指针指向的内存,还可以管理自定义的资源,如自定义的释放器等。...然后,我们创建了另一个 std::shared_ptr,与第一个 std::shared_ptr 共享同一块内存。这意味着两个 std::shared_ptr 对象共享同一个计数器和同一块内存。...动态分配的资源: std::unique_ptr 通常用于管理动态分配的资源,如内存、文件句柄等。它不仅可以管理指针指向的内存,还可以管理自定义的资源,如自定义的释放器等。...通过使用 std::unique_ptr,我们可以方便地管理动态分配的资源,并避免内存泄漏和空悬指针等问题。

    19810

    MSVC std::unique_ptr 源码解析

    ,deleter_type 为删除器类型,我们主要关注 pointer,pointer 的类型由 _Get_deleter_pointer_type 决定,我们可以发现它有两个定义,前者是默认定义,当删除器中没有定义...,这时候由于删除器是可默认构造的,pair 中保存的删除器会被直接默认构造。..._Myval2); } } 比较简单,先判断 pair 中保存的裸指针是否为空,不为空的话则调用 pair 中保存的 deleter 来释放内存。..._Get_first()(_Old); } } 从代码上可以看出来,get() 和 release() 并不会触发内存销毁,而 reset() 的内存销毁也是有条件的,只有 reset() 为空指针时才会触发销毁...总结 std::unique_ptr 有两个定义,分别针对普通类型和数组类型 std::unique_ptr 第二个模板参数是删除器,不传递的情况下使用的是 default_delete std::unique_ptr

    1.6K10

    为何优先选用unique_ptr而不是裸指针?

    在《拥抱智能指针,告别内存泄露》中说到了内存泄漏问题,也提到了C++中的智能指针基本原理,今天就来说说类模板unique_ptr。 在此之前,先回答读者的一个提问:C语言中该怎么办?...,p为内置指针 通常来说,在销毁对象的时候,都是使用delete来销毁,但是也可以使用指定的方式进行销毁。... up(d);//空的unique_ptr 含义分别如下: T unique_ptr管理的对象类型 D 删除器类型 t unique_ptr管理的对象 d 删除器函数/function对象等,...后面我们也可以看到,与shared_ptr不同,unique_ptr在编译时绑定删除器,避免了运行时开销。...如: up = nullptr;//置为空,释放up指向的对象 up.release();//放弃控制权,返回裸指针,并将up置为空 up.reset();//释放up指向的对象 可以看到release

    1.8K00

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

    C++11引入了智能指针的概念,它是一种对象,当其作用域结束时,它会自动删除所指向的对象。智能指针有助于防止内存泄漏,它们封装了原始指针,使得内存管理更加自动化。...当计数器变为0时,对象就会被删除。...ptr; // ptr2和ptr现在都指向同一个int对象,计数器为2std::weak_ptr的特性和使用std::weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个由std::shared_ptr...; // wptr是对ptr的观察者,不会增加计数器智能指针的使用案例以下是一个使用std::shared_ptr的例子,展示了如何使用智能指针来管理内存。...和ptr现在都管理MyClass对象,计数器为2 } // ptr2离开作用域,MyClass对象的计数器变为1} // ptr离开作用域,MyClass对象的计数器变为0,对象被删除在这个例子中

    9200

    C++智能指针学习(一)

    以上代码利用 std::move 将 up1 持有的堆内存(值为 123)转移给 up2,再把 up2 转移给 up3。...3、自定义智能指针对象持有的资源的释放函数: 默认情况下,智能指针对象在析构时只会释放其持有的堆内存(调用 delete 或者 delete[]),但是假设这块堆内存代表的对象还对应一种需要回收的资源(...如操作系统的套接字句柄、文件句柄等),我们可以通过自定义智能指针的资源释放函数。...假设现在有一个 Socket 类,对应着操作系统的套接字句柄,在回收时需要关闭该对象,我们可以如下自定义智能指针对象的资源析构函数,这里以 std::unique_ptr 为例: class Socket..., deletor); return 0; } 自定义 std::unique_ptr 的资源释放函数其规则是: std::unique_ptr

    76620

    对象池的使用场景以及自动回收技术

    这个对象构建的时候,有一些耗时的资源可以重复利用。比如redisContext的网络连接。又或者如果对象的频繁申请释放会带来一些其他的资源使用问题,比如内存碎片。重复利用能够提升程序的效率。...要实现自动回收的对象池,首先要了解unique_ptr和shared_ptr都可以自定义删除器,也就是说,比如当从对象池获取到的对象是用智能指针包裹的,一般默认的删除器为delete,那我们可以自义定删除器为...主要如下阐述: 因为我们需要把智能指针的默认删除器改为自定义删除器,用shared_ptr会很不方便,因为你无法直接将shared_ptr的删除器修改为自定义删除器,虽然你可以通过重新创建一个新对象,把原对象拷贝过来的做法来实现...而unique_ptr由于是独占语义,提供了一种简便的方法方法可以实现修改删除器,所以用unique_ptr是最适合的。...的时候的参数要设置为可变参数,其实现如下: template<typename...

    1.1K40

    C++的auto_ptr智能指针:从诞生到被弃用的历程

    C++作为一种功能强大的编程语言,为开发者提供了众多便捷的特性和工具,其中智能指针是其重要特性之一。智能指针能够自动管理内存,有效避免内存泄漏等常见问题。...std::cout std::endl;} // p离开作用域,自动删除指向的int对象int main() { func(); return 0;}auto_ptr对象p...如果尝试用auto_ptr来管理一个动态分配的数组,编译器将报错:std::auto_ptr p(new int[10]); // 错误,auto_ptr不支持数组这一限制使得auto_ptr...unique_ptr:类似于auto_ptr,unique_ptr也用于管理单个对象的内存,但它不会发生所有权转移的问题。...unique_ptr通过禁用拷贝构造函数和拷贝赋值运算符,确保了对象的所有权唯一性。同时,unique_ptr支持自定义删除器,可以方便地管理不同类型的资源。

    14410

    C++智能指针「建议收藏」

    五、自定义删除器 一、基础知识介绍 裸指针常出现以下几个问题: 忘记释放资源,导致资源泄露(常发生内存泄漏问题) 同一资源释放多次,导致释放野指针,程序崩溃 写了释放资源的代码,但是由于程序逻辑满足条件...在shared_ptr和weak_ptr的基类_Ptr_base中,有两个和引用计数相关的成员,_Ptr是指向内存资源的指针,_Rep是指向new出来的计数器对象的指针 class shared_ptr...:seconds(2)); return 0; } 五、自定义删除器 通常我们使用智能指针管理的资源是堆内存,当智能指针出作用域的时候,在其析构函数中会delete释放堆内存资源,但是除了堆内存资源...template class ArrDeletor { public: // 对象删除的时候需要调用对应删除器的()重载函数 void operator()(T*...operator()" << endl; delete[] ptr; } }; template class FileDeletor { public: // 对象删除的时候需要调用对应删除器的

    49110
    领券