代码随想录八股文四十天训练营
K_Watchmen
这个作者很懒,什么都没留下…
展开
-
字符的输入输出、字符串的输入输出
3、cin与cout,还有string,必须包含#include “string”1、getchar()和putchar()2、cin与cout,还有char[]2、scanf()和printf()1、scanf()和printf()3、cin与cout。原创 2024-07-31 22:38:30 · 122 阅读 · 0 评论 -
指针解引用传递给引用参数
调用 functionAcceptingReference 函数时,通过解引用 ptr 来传递对象引用,即 functionAcceptingReference(*ptr)。创建 MyClass 对象 obj 并获取其指针 ptr。原创 2024-07-31 22:19:57 · 263 阅读 · 0 评论 -
重载输出运算符
在类外定义了 operator<< 函数。这个函数使用 std::ostream& os 来表示输出流,const Bike& bike 表示要输出的对象。函数体中,os << bike.frame << " " << bike.tires;将 Bike 对象的成员变量打印到输出流中。通过重载 << 运算符,可以方便地将自定义类对象的内容打印到输出流中。原创 2024-07-31 21:53:30 · 150 阅读 · 0 评论 -
如何避免线程安全问题
在多线程编程中,避免线程安全问题涉及多个方面,从使用适当的同步机制、管理锁的使用,到设计线程安全的数据结构和确保资源管理的正确性。通过正确地应用这些技术和策略,可以有效地提高程序的稳定性和性能,减少并发编程中常见的错误。原创 2024-07-30 21:22:37 · 383 阅读 · 0 评论 -
设计或使用共享内存的时候你会注意些什么
使用互斥锁:使用互斥锁(如 std::mutex 在 C++ 中)来保护共享内存中的数据,以确保在任意时刻只有一个进程可以访问或修改数据。使用信号量:使用信号量(如 POSIX 信号量)来控制对共享内存的访问,以协调进程间的同步。设置适当的权限:在创建共享内存时设置适当的权限,确保只有授权的进程能够访问。设计良好的协议:在进程间设计通信协议,确保各进程正确协调对共享内存的访问。问题:确保只有授权进程可以访问共享内存,防止未授权的访问和潜在的安全风险。数据加密:对共享内存中的敏感数据进行加密,以增加安全性。原创 2024-07-30 21:18:52 · 391 阅读 · 0 评论 -
vector 和 list 有哪些区别
插入和删除:在尾部插入或删除是 O(1) 时间复杂度,其他位置的插入或删除是 O(n) 时间复杂度,因为需要移动元素。缺点:当向 std::vector 添加或删除元素时,可能需要重新分配内存和移动现有元素,这可能会导致性能开销。内存布局:std::list 是一个双向链表,元素在内存中不是连续存储的,每个元素包含指向前后元素的指针。插入和删除:在任意位置插入或删除元素是 O(1) 时间复杂度,只要已经有了指向插入或删除位置的迭代器。内存管理:每个元素都有自己的内存块,不需要移动其他元素,只需调整指针。原创 2024-07-30 20:17:52 · 364 阅读 · 0 评论 -
如何控制 new 分配的内存空间?
在某些情况下,可能需要更精确地控制内存分配,以确保高效利用内存或满足特定的对齐要求。在C++17及更高版本中,可以使用对齐版本的 new 操作符来分配对齐的内存。重载 new 和 delete 操作符,可以实现自定义的内存管理逻辑。使用如 TCMalloc、jemalloc 等高效内存分配库,这些库提供了更高效的内存分配策略,可以减少碎片和提高分配速度。原创 2024-07-30 20:03:42 · 289 阅读 · 0 评论 -
针对于 new 相关情景问答
使用 new 分配的内存必须使用 delete 或 delete[] 释放,因为 new 和 delete 是成对使用的,而 malloc 和 free 是另一对成对使用的函数。混用会导致未定义行为。使用 new 分配的内存必须使用 delete 或 delete[] 释放,因为 new 和 delete 是成对使用的,而 malloc 和 free 是另一对成对使用的函数。基类指针删除派生类对象时,如果基类具有虚析构函数,会确保首先调用派生类的析构函数,然后调用基类的析构函数,从而正确地释放资源。原创 2024-07-30 19:56:49 · 542 阅读 · 0 评论 -
C++动态内存管理的理解
C++ 动态内存管理是指。它提供了灵活的内存使用方式,使得程序可以根据需要在运行时分配和释放内存,而不是在编译时确定。这种灵活性对于处理复杂数据结构和大型数据集尤其重要。原创 2024-07-30 19:37:59 · 687 阅读 · 0 评论 -
C++是如何实现继承的和为什么这么做
继承的实现涉及多个方面,包括类的成员布局、构造函数和析构函数的调用顺序、虚函数表(vtable)的使用等。当一个类继承另一个类时,派生类对象的内存布局包含基类的成员和派生类自己的成员。基类的成员变量在派生类对象的内存中位于派生类自己的成员变量之前。当创建一个派生类对象时,首先调用基类的构造函数,然后调用派生类的构造函数。销毁对象时,首先调用派生类的析构函数,然后调用基类的析构函数。虚函数表用于实现多态性。含有虚函数的类会有一个指向虚函数表的指针(vptr),表中存储了该类的虚函数地址。原创 2024-07-30 19:15:34 · 182 阅读 · 0 评论 -
C++的理解,和C++的优缺点
C++是一种通用的编程语言,由Bjarne Stroustrup在1979年设计和开发,是对C语言的扩展。C++在保留了C语言的高效性和低级操作能力的基础上,引入了面向对象编程(OOP)等高级特性。它广泛用于系统编程、游戏开发、高性能应用程序、实时系统等领域。原创 2024-07-30 19:02:04 · 216 阅读 · 0 评论 -
C++:什么是构造函数和析构函数?构造函数、析构函数可以是虚函数吗?
析构函数是在对象生命周期结束时自动调用的特殊成员函数。他的主要目的是释放对象占用的资源、执行必要的清理操作。原创 2024-07-24 11:34:00 · 116 阅读 · 0 评论 -
C++:虚函数表和虚函数指针的创建时机
背景:用来实现多态,多态:一个接口,有多重形式;静态多态(函数重载)(在编译器就已经确定)和动态多态(子类重写基类虚函数,运行时才能确定)(基类指针指向一个具体的对象类型,如果是该对象是基类,就从基类的虚函数表里去找函数,如果是子类,从子类的虚函数表里去找相应对的函数指针)1、在类中有虚函数,**在编译器编译时会生成虚函数表;**或者继承过来虚函数表2、存放在哪里?在磁盘中的存储形式(可执行程序)和在内存中的存储形式(运行状态)**磁盘中:**在只读数据段中。原创 2024-07-23 11:23:57 · 393 阅读 · 0 评论 -
C++:虚函数与纯虚函数的区别
【代码】C++:虚函数与纯虚函数的区别。原创 2024-07-23 11:18:28 · 146 阅读 · 0 评论 -
C++11:override关键字
3.编译器可以给你验证 override 对应的方法名是否是你父类中所有的,如果没有则报错.。位置:函数调用运算符之后,函数体或纯虚函数标识 “= 0” 之前。作用:在成员函数声明或定义中, override。2.告诉阅读你代码的人,这是方法的复写。1.可以当注释用,方便阅读。原创 2024-07-22 17:26:56 · 186 阅读 · 0 评论 -
C++:怎么实现多态?
C++中的多态性是通过虚函数(virtual function)和虚函数表(vtable)来实现的。多态性允许在基类类型的指针或引⽤上调⽤派⽣类对象的函数,以便在运⾏时选择正确的函数实现。虚函数表:编译器在对象的内存布局中维护了⼀个虚函数表,其中存储了指向实际函数的指针。这个表在运⾏时⽤于动态查找调⽤的函数。2.派⽣类重写虚函数:在派⽣类中重写基类中声明的虚函数,使⽤ override 关键字。3.使⽤基类类型的指针或引⽤指向派⽣类对象。原创 2024-07-22 17:20:24 · 163 阅读 · 0 评论 -
C++:重写、重载、隐藏
重写可以有两种,直接重写成员函数和重写虚函数,只有重写了虚函数才能算是C++多态性重写方法的参数列表,返回值,所抛出的异常与被重写方法一致;被重写的方法不能为private静态方法不能被重写为非静态的方法重载则是允许有多个同名的函数,而这些函数的参数列表不同(参数个数、参数类型)(发生在同一个类中)不能通过访问权限,返回类型、所抛出的异常进行重载;隐藏是指派生类的函数屏蔽了与其同名的基类函数。通常有两种情况:如果派生类的函数与基类的函数同名,但是参数不同,此时无论有无virtual,基类的函原创 2024-07-22 17:08:53 · 191 阅读 · 0 评论 -
C++:面向对象三大特性:封装、继承、多态
封装可以使得代码模块化,继承可以扩展已经存在的代码,多态的目的是为了接口重用;原创 2024-07-22 16:51:27 · 538 阅读 · 0 评论 -
C++:什么是内存泄漏,如何检测和防止?
内存泄漏时由于疏忽和错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了该段内存的控制,因为造成了内存的浪费;可以使用Valgrind,mtrace进行内存泄漏检查内存泄漏分类堆内存泄露:指的是程序运行中根据需要分配通过malloc new等从堆中分配的一块内存,完成后必须通过对应的free/delete删掉,如果没有删掉,那么此后这块内存就不会被再使用,就会产生堆内存泄露;系统资源泄露:程序使用系统分配的资源比如B原创 2024-07-22 15:54:49 · 229 阅读 · 0 评论 -
C++:堆和栈的区别
堆和栈都是用于存储程序数据的内存区域。原创 2024-07-22 15:44:53 · 151 阅读 · 0 评论 -
C++:智能指针的实现原理是什么?
智能指针本质是一个类模版,它可以创建任意的类型的指针对象,当智能指针对象使用完后,对象就会自动调用析构函数去释放该指针所指向的空间。原创 2024-07-21 17:28:11 · 201 阅读 · 0 评论 -
C++:什么是智能指针
通过独占所有权,确保只有一个std::unique_ptr可以拥有指定的内存资源。移动语义和右值引用允许std::unique_ptr在所有权转移时高效的进行转移。提供更灵活的内存共享,但可能存在循环引用的问题。std::weak_ptr可以从std::shared_ptr创建,但不会增加引用计数,不会影响资源的释放。通过std::weak_ptr::lock()可以获取一个std::shared_ptr来访问资源。std::weak_ptr用于解决std::shared_ptr可能导致的循环引用问题。原创 2024-07-21 17:14:37 · 271 阅读 · 0 评论 -
C++:构造函数调用规则
如果 C++ 类中 , 定义了 非拷贝构造函数 , 如 : 有参构造函数 / 无参构造函数 , C++ 编译器 不会提供 默认的无参构造函数 , 但是 会提供 默认的 拷贝构造函数;如果 C++ 类中 没有定义拷贝构造函数 , C++ 编译器会自动为该类提供一个 " 默认的拷贝构造函数 " , 在函数中对成员变量进行简单的复制操作;, C++ 编译器会自动为该类提供一个 " 默认的无参构造函数 " , 函数体为空 , 不做任何操作;: 如果 C++ 类中。原创 2024-07-21 16:51:10 · 197 阅读 · 0 评论 -
C++:指针常量和常量指针
常量指针是一个指针,指针中存放的地址中的值是常量,该指针存放的地址却是可变的;(说明指针中存放的地址不可改)但是存放的地址中的内容可变;即指针变量不可修改;4. const位于*之后:int * const p //指针常量。指针常量是一个常量,该指针存放的地址不可变,但该地址中存放的值可以变。原创 2024-07-21 16:24:58 · 165 阅读 · 0 评论 -
C++:内存分区
C++程序运⾏时,内存被分为⼏个不同的区域,每个区域负责不同的任务。原创 2024-07-21 15:05:32 · 150 阅读 · 0 评论 -
C++:指针和引用的区别
间接访问变量:指针和引用都可以用来间接访问变量。指针:通过指针变量访问其所指向的内存地址中的数据。引用:通过引用变量访问其所引用的对象。**作为函数参数:都可以用来实现对函数参数的引用传递,从而允许在函数内部修改传入的实际参数。指针参数:函数接收指针,可以修改指针所指向的内存内容。引用参数:函数接收引用,可以修改被引用的对象。动态分配:都可以与动态内存分配结合使用。指针:可以指向动态分配的内存。引用:可以引用动态分配的对象。原创 2024-07-16 09:51:37 · 172 阅读 · 0 评论 -
C++:局部变量、全局变量和静态变量之间的区别
在定义全局变量时,你需要为它分配内存,这样在其他文件中引用它时,才能访问到正确的内存位置。而extern关键字只告诉编译器这个变量在别的文件中定义,自己不分配内存。原创 2024-07-16 09:45:02 · 673 阅读 · 0 评论 -
第23天:C++内存分区
待定。原创 2024-07-10 18:20:09 · 99 阅读 · 0 评论 -
C++:static和const关键字的作用
一个全局变量默认是有外部属性的,但是static修饰后就只能在定义变量所在的源文件使用,不能在其他文件内使用;也就是说作用域变小了。一个函数默认是有外部连接属性的,但是被static修饰后,就变成了内部属性,只能在变量所在的源文件内部使用,其他源文件不能使用。将变量的位置由栈区该到了静态区,生命周期延长了,作用范围没变,但出了作用范围不会被销毁。原创 2024-07-10 18:18:32 · 104 阅读 · 0 评论 -
第四天:HTTP2.0和HTTP1.1的区别?
待定。原创 2024-07-10 17:25:33 · 107 阅读 · 0 评论 -
C++:结构体和类的区别
struct用于表示一组相关的数据,而class用于表示一个封装了数据和操作的对象。如果仅仅组织数据,不涉及封装和继承关系,使用struct更直观;若需要进行封装、继承等面向对象编程的特性,使用class。struct结构体中的成员默认是pubilc。类中成员默认是private。struct继承时默认的是公有继承,class继承默认使用私有继承。如果结构体没有定义任何构造函数,编译器会生成默认的无参构造函数。如果类没有定义任何构造函数,编译器也会生成默认的无参构造函数。结构体实例化后通过.运算符原创 2024-07-10 17:25:02 · 101 阅读 · 0 评论 -
第三天:什么是强缓存和协商缓存?
待定。原创 2024-07-10 17:24:02 · 74 阅读 · 0 评论 -
第三天:HTTP请求中常见的状态码?
待定。原创 2024-07-10 17:22:20 · 86 阅读 · 0 评论 -
第二天:HTTP的请求方式有那些?
待定。原创 2024-07-10 17:21:45 · 271 阅读 · 0 评论 -
Linux系统是如何收发网络包的?
Linux系统是如何收发网络包的?转载 2024-07-09 13:55:55 · 23 阅读 · 0 评论 -
第二天:HTTP请求报文和响应报文是怎样的(计算机网络)
虽说POST 的功能与GET 很相似,但POST 的主要目的并不是获取响应的主体内容。POST方法期初是用来向服务器输入数据的,实际上,通常会用它来支持HTML的表单。⑤是报文体,它将一个页面表单中的组件值通过 param1=value1¶m2=value2 的键值对形式编码成一个格式化串,它承载多个请求参数的数据。请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。原创 2024-07-08 20:42:25 · 1281 阅读 · 0 评论 -
代码随想录八股文第一天(计算机网络)
负责数据的格式化、加密和压缩**,以确保数据在不同系统之间的交换是有效的和安全的。它还提供了数据格式转换和语法转换的功能。会话层(Session Layer):会话层管理应用程序之间的。原创 2024-07-08 10:56:45 · 1125 阅读 · 0 评论