C++
Stitch的知识星球
这个作者很懒,什么都没留下…
展开
-
C++面试实战之内存泄露
考虑替代方案:如果频繁出现内存分配失败的情况,考虑使用更高效的内存管理方式,如对象池、内存池等,以提前分配好一定数量的内存块,并在需要时从中获取。返回空指针时,表示内存分配失败,通常是由于可用的内存块不足或分配的内存大小超出了系统所能提供的限制。释放不必要的内存:如果程序中有已经分配的但暂时未使用的大内存块,可以考虑释放掉这些不必要的内存,以腾出空间供分配失败的情况使用。优化内存使用:评估代码中对内存的使用情况,尽可能减少动态内存分配的需求,并优化算法、数据结构等,以降低内存消耗。原创 2024-01-16 13:28:51 · 393 阅读 · 0 评论 -
C++面试实战问题之new和malloc
必须保证 this 对象是通过 new(不是 new[]、不是 placement new、不是栈上、不是全局、不是其他对象成员)分配的。作用:重新调整之前分配的内存块的大小。分配的内存只在函数的生命周期内有效,不需要手动释放。可能会更改内存块的位置,因此应该谨慎处理指向旧内存块的指针。只是简单地分配指定大小的内存块,不进行类型检查和对象的构造。分配的内存中的内容是未初始化的,需要手动进行初始化。之后继续使用该对象的指针,否则会导致悬挂指针的问题。返回指向分配内存的指针,且与要分配的类型相匹配。原创 2024-01-16 13:17:17 · 371 阅读 · 0 评论 -
C++面试实战问题之队列、链表
需要根据具体的应用场景选择适合的链表类型。双向链表(Doubly Linked List)是一种链表的扩展形式,除了包含指向下一个节点的指针外,还包含指向上一个节点的指针。循环队列的实现:循环链表也可以用于实现循环队列,通过头指针和尾指针分别指向队列的头部和尾部,实现元素的循环入队和出队操作。实现栈和队列:使用单向链表可以方便地实现栈和队列的操作,例如,将链表头作为栈顶,每次插入和删除节点都在头部进行。图的表示:在图的算法中,双向链表可以用于表示邻接表,记录图中每个节点的邻居节点,方便图的遍历和操作。原创 2024-01-16 13:08:36 · 349 阅读 · 0 评论 -
C++面试合集问题之堆、栈
将对象的生成限制在堆上可以更加灵活地控制对象的生命周期,避免了在栈上创建对象后由于作用域结束而自动释放资源的情况。原因:将对象限制在栈上生成具有以下优势:首先,栈上分配的对象不需要手动管理其生命周期,对象的销毁由编译器自动处理,减少了手动释放资源的麻烦。其次,栈上分配的对象的创建和销毁速度更快,因为它们仅仅是在栈上分配一块内存,不需要进行动态内存分配和释放。在栈上分配的对象会在其所属作用域结束时自动销毁,从而实现只能在栈上生成对象的效果。栈:栈的内存分配是连续且固定的,因此分配和释放内存的效率很高。原创 2024-01-16 13:07:14 · 382 阅读 · 0 评论 -
C++面试问题合集之哈希
在链地址法中,当负载因子较高时,可以通过增加哈希桶的数量来分散元素,从而减少冲突发生的概率,并保持较低的平均查找时间。再哈希法可以采用不同的哈希函数或者在同一个哈希函数上应用不同的哈希算法来计算新的哈希值,以期望分布更均匀,减少冲突的概率。链表法(Chaining):将哈希表的每个位置(桶)维护一个链表,当发生哈希冲突时,将冲突的元素插入到对应位置的链表中。需要注意的是,由于哈希函数将无限数量的输入映射到有限数量的哈希值,因此可能会出现哈希碰撞的情况,即不同的输入数据生成相同的哈希值。原创 2024-01-16 13:05:24 · 409 阅读 · 0 评论 -
C++面试合计问题之vector
reserver修改的是vector的capacity的值,只表示一种尝试,当vector的现有实际size大于reserve(n)的n值时,vector不做任何修改。resize 改变vector的实际大小,可能导致vector中的多余元素被删除,接受两个参数的resize不仅改变vector大小,也改变元素的默认值。reserve 的作用是在vector初始化时,根据预估的所需要的内存大小 提前申请内存,目的是避免程序运行中重复的申请、释放内存空间,以提高程序的效率;可能是一个更好的选择。原创 2024-01-16 13:03:44 · 425 阅读 · 0 评论 -
常见的智能指针
为了在结构较复杂的情景中执行上述工作,标准库提供 weak_ptr、bad_weak_ptr 和 enable_shared_from_this 等辅助类。一旦拥有着被销毁或编程 empty,或开始拥有另一个对象,先前拥有的那个对象就会被销毁,其任何相应资源亦会被释放。weak_ptr 允许你共享但不拥有某对象,一旦最末一个拥有该对象的智能指针失去了所有权,任何 weak_ptr 都会自动成空(empty)。多个智能指针可以共享同一个对象,对象的最末一个拥有着有责任销毁对象,并清理与该对象相关的所有资源。原创 2024-01-16 11:33:47 · 354 阅读 · 0 评论 -
C++面向对象三大特征
面向对象程序设计(Object-oriented programming,OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。面向对象三大特征 —— 封装、继承、多态1 封装把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。关键字:public, protected, private。不写默认为 private。public成员:可以被任意实体访问protected成员:只允许被子类及本类的成员函数访问。原创 2024-01-16 11:14:32 · 351 阅读 · 0 评论 -
C++面试经典问题-explicit(显式)关键字
explicit 修饰构造函数时,可以防止隐式转换和复制初始化。explicit 修饰转换函数时,可以防止隐式转换,但。explicit(显式)关键字。原创 2024-01-16 11:10:57 · 351 阅读 · 0 评论 -
C++面试经典问题-Union联合
联合(union)是一种节省空间的特殊的类,一个 union 可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当某个成员被赋值后其他成员变为未定义状态。匿名 union 不能包含 protected 成员或 private 成员。匿名 union 在定义所在作用域可直接访问 union 成员。全局匿名联合必须是静态(static)的。默认访问控制符为 public。不能继承自其他类,不能作为基类。可以含有构造函数、析构函数。不能含有引用类型的成员。原创 2024-01-16 11:08:50 · 390 阅读 · 0 评论 -
struct 和 class区别
struct 作为数据结构的实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认的成员变量访问控制是 private 的。总的来说,struct 更适合看成是一个数据结构的实现体,class 更适合看成是一个对象的实现体。默认的继承访问权限。struct 是 public 的,class 是 private 的。最本质的一个区别就是默认的访问控制。原创 2024-01-12 12:30:54 · 376 阅读 · 0 评论 -
struct 和 typedef struct在C和C++中的区别
C 中。原创 2024-01-12 12:28:46 · 394 阅读 · 0 评论 -
C++面试八股--inline函数
内联是在编译期建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态性时(运行期)不可以内联。在类中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。内联函数相比宏函数来说,在代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。是否内联,程序员不可控。虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联。在类声明中定义的函数,除了虚函数的其他函数都会自动隐式地当成内联函数。原创 2024-01-12 11:43:58 · 495 阅读 · 0 评论 -
C++面试八股--static和this指针
当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。指针是一个隐含于每一个非静态成员函数中的特殊指针。指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);,之后的函数调用不再进行初始化;指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用。当对一个对象调用成员函数时,编译程序先将对象的地址赋给。的,而在文件外是不可见的,从而可以在。,使得该变量在静态存储区分配内存;在声明该变量的整个文件中都是可见的。在实现一些数据结构时,如。原创 2024-01-12 11:41:19 · 361 阅读 · 0 评论 -
C++面试问题---Const
1.const1.1 作用修饰变量,说明该变量不可以被改变;修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改;修饰成员函数,说明该成员函数内不能修改成员变量。1.2 const 的指针与引用指针指向常量的指针(pointer to const)自身是常量的指针(常量指针,const pointer)原创 2024-01-12 11:38:53 · 508 阅读 · 0 评论 -
函数模板和类模板
通过使用函数模板,可以编写能够适用于不同类型的数据的函数,提高代码的重用性和灵活性。使用函数板的时候,可以直接调用它,编译器会根据传入的参数类型自动推导模板的具体类型。使用类模板时,可以根据需要显式地指定类型参数,也可以根据上下文的推断方式自动推导类型参数。一般可以,如果不行可以使用类型特定的函数或方法进行加法操作,即为 T 类型定义一个成员函数或者全局函数来实现加法操作。有一个函数模板,模板参数是T,假设是a和b,两个都是T类型的,是否能返回T类型的a+b,如果不能,需要做什么操作?原创 2024-01-11 11:12:57 · 316 阅读 · 1 评论 -
常见设计模式--通俗易懂版
一、设计模式原则一、设计模式原则1.单一职责原则核心:一个类只负责一个功能领域中相应的职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。思想:如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。单一职责原则注意事项和细节1) 降低类的复杂度,一个类只负责一项职责。2) 提高类的可读性,可维护性3) 降低变更引起的风险。原创 2024-01-10 11:34:20 · 1433 阅读 · 0 评论 -
面试常见知识点--树的遍历
前序遍历。原创 2024-01-10 11:20:44 · 466 阅读 · 0 评论 -
面试常见的排序算法
堆排序一、各个排序算法的时间复杂度一、归并排序归并思想思想将两个有序的数组合并成一个有序的数组。第一步将数组进行分解,当分解成单个元素为一组的时候才是组内有序的。第二步将两两有序的数组进行合并,将两个有序数组合并成一个有序数组。重复第二步,直至排序完成。合并的步骤先申请两数组合并后那么大小的空间,然后将两个排好序的数组逐一进行比较,往申请空间里面放。递归前进:自己调用自己的语句递归回退return,通过递归结束条件进行回退在哪里调用的函数,函数的返回值就返回到哪里。原创 2024-01-10 10:40:46 · 465 阅读 · 0 评论