自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(143)
  • 收藏
  • 关注

原创 面试二十五、remove和earse的区别

vector中erase的作用是删除掉某个位置position或一段区域(begin, end)中的元素,减少其size,返回被删除元素下一个元素的位置。vector中remove的作用是将范围内为val的值都remove到后面,返回新的_last值(非val部分的end),但传入的原vector的end并没有发生改变,因此size也就没有变化。remove。

2024-05-06 10:40:42 485

原创 面试二十四、继承多态

如果派生类中没有show()函数,则可以调用基类的show()方法,但是如果派生类中存在show()同名的,不管参数列表,会将基类的show隐藏,包括基类中show函数的全部重载。首先看指针的类型,然后看调用函数在父类中是正常的函数还是虚函数,如果是正常函数在编译的时候就知道了,如果是虚函数,先要查找子类的虚函数表(因为虚函数会被重写或者覆盖),然后调用函数,:继承是实现多态的基础。:继承关系可以形成继承链,允许多层次的继承,子类可以继承父类的属性和行为,而子类的子类又可以继承子类的属性和行为,以此类推。

2024-05-01 18:22:20 1095

原创 面试二十三、 strcpy 和memcpy 以及字符串和字符数组相互转换

strcpy和memcpy都是浅拷贝操作,它们只是简单地将源数据复制到目标位置,而不会复制源数据所指向的内容。strcpy会复制源字符串的内容直到遇到null终止符,并将其复制到目标字符串中。但是它不会复制源字符串指针所指向的内存,因此如果源字符串是指向动态分配内存的指针,只会复制指针值而不会复制其指向的内存块。这就是所谓的浅拷贝。memcpy会复制指定长度的内存块,但它对数据的内容一无所知,只是简单地按字节复制。因此,如果源数据包含指针或其他引用,memcpy。

2024-04-27 15:01:35 351

原创 面试二十二、跳表SkipLists

跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集(见右边的示意图)。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻的元素中间。这时,算法将跳转到下一个层次,重复刚才的搜索,直到找到需要查找的元素为止。一张跳跃列表的示意图。每个带有箭头的框表示一个指针, 而每行是一个稀疏子序列的链表;底部的编号框(黄色)表示有序的数据序列。

2024-04-25 22:09:28 959

原创 面试二十一、红黑树

性质:插入:旋转:

2024-04-24 22:08:06 570

原创 面试二十、AVL平衡二叉树

2024-04-23 21:42:40 75

原创 面试二十、BST二叉排序树

二叉排序树是一种二叉树,其每个节点的值大于其左子树中任意节点的值,小于其右子树中任意节点的值,这样可以保证树的有序性。对于动态查找表,插入和删除操作频繁,而二叉排序树能够在 O(log n) 的时间内实现插入和删除操作,并且能够保持树的有序性。顺序表通过数组实现,可以提供常数时间的随机访问,因此在静态情况下,适合顺序表存储,这样可以简化数据的组织和访问。对于查找操作,由于有序表,可以采用二分查找算法来实现,其时间复杂度为 O(log n),这是一种高效的查找方法。

2024-04-23 21:07:18 213

原创 面试十九、哈希表

2024-04-23 16:10:58 83

原创 面试十八、容器适配器

容器适配器是一种特殊类型的容器,它们提供了一种不同于常规容器的接口和行为。容器适配器通常是建立在其他容器之上,通过改变接口或添加限制来满足特定的需求或解决特定的问题。优先队列是一种特殊类型的队列,它的元素按照一定的优先级进行排序,每次删除操作都会删除优先级最高的元素。队列是一种先进先出(FIFO)的数据结构,它允许在队列的一端进行插入操作,在另一端进行删除操作。栈是一种后进先出(LIFO)的数据结构,它只允许在栈顶进行插入和删除操作。是一个容器适配器,它的默认实现基于双端队列。优先队列适配器提供了。

2024-04-22 22:02:50 513

原创 面试十七、list和deque

Deque容器是连续的空间,至少逻辑上看来如此,连续现行空间总是令我们联想到array和vector,array无法成长,vector虽可成长,却只能向尾端成长,而且其成长其实是一个假象,事实上(1) 申请更大空间 (2)原数据复制新空间 (3)释放原空间 三步骤,元素存放在堆中,每个元素都是放在一块内存中,他的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供[]操作符的重载。但是由于链表的特点,它可以很有效率的支持任意地方的删除和插入操作。

2024-04-22 20:22:52 379

原创 面试十六、emplace原理

【代码】面试十六、emplace原理。

2024-04-22 17:02:31 290

原创 面试十五 容器

记录了用户从中获取的哪一个元素的迭代器,记录在Iterator_Base链表中,哪一个迭代器增加或删除要让其失效并重新更新。迭代器失效是指:迭代器的底层其实就是容器的原生指针,插入元素可能导致容器内部的数据结构重新分配,从而使得原先的迭代器指向的位置不再有效;删除元素可能导致迭代器指向的位置被移动或删除,从而使得原先的迭代器不再指向期望的位置。然后判断链表中的迭代器,看它是否在插入、删除点和_last之间,将会失效,失效的话将迭代器的容器对象赋值为nullptr,再进行 operator!

2024-04-22 15:15:27 377

原创 面试十四、内存泄漏

当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露。:RAII 是一种重要的编程技巧,通过在对象的构造函数中获取资源,在析构函数中释放资源,来确保资源的正确管理。:智能指针是 C++ 中的一个重要特性,它能够自动管理动态分配的内存,当智能指针超出作用域时,会自动释放所指向的内存。:在需要动态内存分配时,应该尽量减少动态内存的使用,优先考虑使用栈上的对象,避免频繁地进行动态内存分配和释放。

2024-04-21 15:45:04 591

原创 面试十三、malloc 、calloc、realloc以及new的区别

3.new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换;void free(void *p) ,释放之前有调用 calloc、malloc 或 realloc 所分配的内存空间,*p指针指向一个要释放内存的内存块。2. 原地址空间没有连续的内存,则重新开辟一片空间,将数据拷贝到新空间,释放原空间,返回新地址指针(注意显式释放问题,引起二次释放的问题)(3) realloc 函数:在之前分配的内存块的基础上,将内存重新分配为更大或者更小的部分。

2024-04-21 15:19:09 692

原创 面试十二、装饰器模式

装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰器模式的目标。其主要缺点是:装饰器模式会增加许多子类,过度使用会增加程序得复杂性。

2024-03-21 20:55:09 288

原创 面试十一、代理模式

代理模式是一种结构型设计模式,旨在为其他对象提供一种代理或替代方法,以控制对这些对象的访问。在代理模式中,代理对象充当了客户端和目标对象之间的中间人,客户端通过代理访问目标对象,而不直接访问目标对象。

2024-03-21 19:29:11 264

原创 面试十 简单工厂、工厂方法、抽象工厂

Factory基类,提供一个纯虚函数(创建产品),定义派生类(具体产品的工厂)负责创建对应的产品,可以做到不同的产品在不同的工厂创建,能够对现有工厂,以及产品的修改关闭。把有关联关系的,属于一个产品族的所有产品创建的接口函数,放在一个抽象工厂里面AbstractFactory,派生类(具体产品的工厂)应该负责创建该产品簇里面的所有产品。实际上,很多产品是有关联关系的,属于一个产品族,不应该放在不同的工厂取创建,这样一不符合实际的产品对象创建逻辑,二是工厂类太多了,不好维护。

2024-03-20 22:01:52 470

原创 面试九 设计模式

单例模式通常被归类为,因为它主要关注如何创建对象的实例,以及如何确保在整个应用程序生命周期中只有一个实例存在。

2024-03-20 15:22:08 766

原创 面试八-git使用

团队内协作需要将成员添加到组里,跨团队协作,fork到自己的github中修改,然后pull requests。将本地库推送到远程库(ArVD就是别名)

2024-03-19 21:35:38 210

原创 面试七、单线程异步、多线程异步、协程

当事件循环处理到该事件时,会调用相应的回调函数来处理操作的结果或者状态变化。协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程,而且协程的切换在用户态完成,切换的代价比线程从用户态到内核态的代价小很多。单线程与事件循环模型中的I/O操作通常采用非阻塞的方式进行,即在发起I/O操作后,程序不会等待操作完成,而是立即返回继续执行后续的任务。在有大量IO操作业务的情况下,我们采用协程替换线程,可以到达很好的效果,一是降低了系统内存,二是减少了系统切换开销,因此系统的性能也会提升。

2024-03-14 19:33:52 370

原创 面试六--TCP粘包问题

这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。流式传输协议(Streaming Protocol)是一种用于在网络上传输数据的通信协议,它允许数据以连续的流的形式进行传输,而不是一次性发送完整的数据包。流式传输协议即协议的内容是像流水一样的字节流,内容与内容之间没有明确的分界标志。5. 按需传输:流式传输可以根据接收端的请求动态调整传输的数据,例如,视频流可以根据用户的带宽和设备性能调整分辨率。

2024-03-13 23:47:30 727

原创 面试五 -bind 和 function

函数对象是一个类,它重载了函数调用操作符operator()。因此,函数对象可以像函数一样被调用,而且可以保存状态。函数对象通常用于STL算法中,例如std::sort等,以及C++11中的Lambda表达式。:绑定器是一种特殊的函数对象,它用于将部分参数绑定到函数上,从而创建一个新的函数对象。

2024-03-12 17:30:58 983

原创 NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver. 失效解决方案

【代码】NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver. 失效解决方案。

2024-03-03 09:43:02 126 1

原创 c++面试四--智能指针原理补充 1.1w字

函数对象(Function Object),也称为仿函数(Functor),是 C++ 中的一种对象,可以像函数一样被调用。函数对象可以是一个类对象,重载了函数调用运算符operator()。通过重载operator(),函数对象可以像函数一样被调用,并且可以保存状态和行为。函数对象的优点在于它可以作为参数传递给算法或者容器的成员函数,从而使得算法或者容器可以更加灵活地处理数据。它还可以实现一些特定的行为,比如在调用时执行额外的操作、记录调用次数等。

2024-03-02 10:25:30 986

原创 c++面试三 -- 智能指针--7000字

/ 自定义类型。

2024-02-29 15:24:43 1193

原创 c++面试2

伙伴系统是一个结合了2的方幂个分配器和空闲缓冲区合并计技术的内存分配方案, 其基本思想很简单. 内存被分成含有很多页面的大块, 每一块都是2个页面大小的方幂. 如果找不到想要的块, 一个大块会被分成两部分, 这两部分彼此就成为伙伴. 其中一半被用来分配, 而另一半则空闲. 这些块在以后分配的过程中会继续被二分直至产生一个所需大小的块. 当一个块被最终释放时, 其伙伴将被检测出来, 如果伙伴也空闲则合并两者.虽然这样做可能会略微增加内存的浪费,但能够提高插入操作的性能,同时也保证了相对较高的空间利用率。

2024-02-28 11:02:07 1053

原创 c++面试一

3.7 智能指针。

2024-02-26 19:26:57 758

原创 C++数据库连接池

时间 如果还获取不到空闲的连接,那么获取连接失败,此处从Connection。表达式定制连接释放的功能(不真正释放连接,而是把连接归还到连接池中)队列为空,还需要再获取连接,此时需要动态创建连接,上限数量是。个连接就可以了,这个功能点肯定需要放在独立的线程中去做。8.连接的生产和连接的消费采用生产者。队列获取空闲连接,可以使用带超时时间的mutex。队列中,使用线程互斥锁保证队列的线程安全。7.用户获取的连接用。队列为空,而此时连接的数量已达上限。的就要被释放掉,只保留初始的。互斥锁来实现连接超时时间。

2024-02-26 10:11:35 285

原创 C++基础4

迭代器失效可能是由于对容器的修改操作导致的。如果在这种操作之后再使用之前的迭代器,它们可能会指向错误的位置或失效。返回的迭代器可能不是有效元素的位置,而是表示末尾的“超过末尾”的位置。如果使用这样的迭代器进行操作,可能会导致未定义的行为。如果你使用了已被销毁的对象(例如,容器中的元素是指针,而指针指向的对象已被删除),那么迭代器将指向无效的内存。类提供的成员函数之一。当容器需要扩容时,它可能会分配新的内存并将元素从旧的内存复制到新的内存中。如果你清空了一个容器,所有的迭代器都将失效,因为没有元素可供迭代。

2024-01-20 14:48:16 375

原创 c++基础3

/ 自定义空间配置器// 开辟内存空间// 相当于malloc分配内存// 释放内存空间// 相当于free释放内存// 负责对象构造// 用定位new在指定内存上构造对象// 负责对象析构ptr->~T();// 显示调用对象的析构函数C++ STL库中vector容器的类模板定义头// 自定义空间配置器// 开辟内存空间// 相当于malloc分配内存// 释放内存空间// 相当于free释放内存// 负责对象构造// 用定位new在指定内存上构造对象。

2024-01-18 22:10:54 1183

原创 c++基础2

/ 引用一个数组。

2024-01-17 20:22:51 1044

原创 C++基础1

1 . 一组函数,其中函数名相同,参数列表的个数和类型不同,那么这一组函数就称作-函数重载2. 一组函数称的上重载必须在同一个作用域3. const 或者volatile 的时候,是怎么影响形参类型的4. 函数名相同,参数列表不同,仅返回值不同?不是重载。

2024-01-16 22:20:55 1044

原创 内存泄漏检测方式

函数的调用,并在每次调用时输出相应的信息。请确保你的系统支持 BPF 功能,并且相关的 uprobes 事件能够被监测。函数,以在分配和释放内存的时候记录一些信息,包括文件名和行号,并将这些信息写入到相应的文件中。这个脚本的目的是监测在进程名为 "memleak" 的情况下,libc 库中的。uprobe挂在的事件和点,然后过滤当前进程等于memleak。函数,实现了在内存分配和释放时记录信息的功能。这段代码使用了动态链接库劫持的方法,通过重载。函数中演示了使用这些宏进行内存分配和释放。

2024-01-16 15:00:42 474

原创 内存泄漏问题

内存泄漏是一种常见的问题,它可能导致系统内存不断增加,最终耗尽可用内存。解决内存泄漏问题通常需要进行调试和分析。

2024-01-15 21:04:14 701

原创 new/delete vs malloc/free

因为它们提供了更好的类型安全性和方便性。然而,如果你在混合使用C和C++的代码,或者在某些特定的情况下,可能需要使用。new是关键字,最后还是调用malloc->brk。malloc是函数,调用brk()需要注意的是,不要混合使用。在C++中,通常更推荐使用。,以避免不一致的内存管理。

2024-01-15 20:39:22 385

原创 Reactor和Proactor两种高效的事件处理模式

有两种高效的事件处理模式:Reactor 和 Proactor,同步I/O模型通常用于实现Reactor模式,异步I/O模型通常用于实现Proactor模式。要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作 线程(逻辑单元),将 socket可读可写事件放入请求队列,交给工作线程处理。除此之外,主线程不做 任何其他实质性的工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。使用同步 I/O(以epoll_wait。

2024-01-15 16:36:35 1064

原创 阻塞/非阻塞 、 同步/异步

非阻塞的时候,线程会执行,遇到recv会直接返回值,返回-1时,会出现errno错误,比如中断引起的EINTR、EAGAIN、EWOULDBLOCK。在处理 IO 的时候,阻塞和非阻塞都是同步 IO,只有使用了特殊的 API 才是异步 IO。阻塞的时候,线程会被处于挂起状态。典型的一次IO的两个阶段是什么?监听到事件处理完成后,会用事先约定好的通知方式,通知。自己来完成的(不管是阻塞还是非阻塞);接口时),数据的读写都是 由请求方A。接口时 (或者调用某个业务逻辑API。接口时(或者调用某个业务逻辑。

2024-01-14 13:01:40 360

原创 函数指针和回调函数 以及指针函数

函数指针可以用来在运行时动态选择调用哪个函数,或者将函数作为参数传递给其他函数。回调函数是一种在编程中常见的概念,它是指一个函数作为参数传递给另一个函数,并在特定事件发生时被调用。

2024-01-13 22:45:38 566

原创 线程同步---信号量

P(等待)操作:当一个进程(或线程)要访问共享资源时,它必须先执行P操作。如果信号量的值大于零,进程可以继续执行临界区代码(访问共享资源),并且信号量的值会减少。如果信号量的值等于零,那么进程将等待,直到信号量的值大于零。信号量的一个常见应用是解决生产者-消费者问题,其中生产者和消费者共享一个有限容量的缓冲区。信号量(Semaphore)是一种用于在多进程或多线程环境中控制对共享资源访问的同步机制。V(释放)操作:当一个进程(或线程)完成对共享资源的访问时,它执行V操作,增加信号量的值。

2024-01-07 18:35:07 478

原创 线程同步---条件变量

(执行条件不满足时等待,满足时执行)

2024-01-07 15:27:23 361

微调codebert、unixcoder、grapghcodebert完成漏洞检测代码

微调codebert、unixcoder、grapghcodebert完成漏洞检测代码

2023-10-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除