
c/c++
文章平均质量分 79
一对一答疑的编程作家朱文伟
这个作者很懒,什么都没留下…
展开
-
C/C++面试的五大必问问题!
假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数(动态绑定)。在C++中,虚函数的作用是实现多态性。(4)”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小;(3) 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了,从一而终。原创 2025-02-26 08:25:40 · 593 阅读 · 0 评论 -
为什么malloc函数需要传入申请的内存大小,而free时候却不需要传大小呢?
例如,假设 malloc 返回的地址是 ptr,堆管理器可能在 ptr 之前的地址存储元信息(如内存块大小)。调用时,free 只需要传入 malloc 返回的指针地址即可,不需要额外传入内存块的大小。其中,malloc 需要传入申请的内存大小,而 free 却不需要,这背后的原因涉及动态内存分配的实现原理和设计哲学。malloc 的功能是从堆中分配一块指定大小的内存,返回该内存块的起始地址。free 不需要大小,因为堆管理器在分配内存时已经记录了每个块的大小,释放时可以通过内部元信息找到相应的数据。原创 2025-02-14 07:24:11 · 498 阅读 · 0 评论 -
面试必考:深入理解 Qt 信号与槽机制:原理、用法与优势
不同之处在于,槽函数能够与信号建立连接,一旦与之关联的信号被发射,槽函数便会自动被调用,执行相应的操作。通过QObject::connect()函数,我们能够指定信号的发送者、信号本身、接收者以及对应的槽函数,从而构建起信号与槽之间的通信桥梁,使得信号发射时能够准确触发相应的槽函数。信号与槽的映射表:这是一个数据结构,它记录了类中每个信号和槽的名称、参数列表以及对应的函数指针(在运行时用于调用信号和槽函数)。调用槽函数:一旦找到对应的映射记录,Qt 会根据记录中的信息,调用所有连接到该信号的槽函数。原创 2025-02-13 20:55:21 · 556 阅读 · 0 评论 -
面试必考:一文搞懂野指针、悬空指针、空指针和内存泄漏,附代码示例!
内存泄漏:指程序在动态分配内存(例如使用malloc、calloc等函数)后,没有释放这些内存,导致这些内存块在程序运行过程中一直被占用,无法被操作系统重新利用。这样,每次调用该函数,就会有一块内存被占用而无法回收,造成内存泄漏。悬空指针:指针原来指向的内存已经被释放(例如通过free函数),但指针本身没有被置为NULL,仍然保存着之前内存的地址。总结,野指针和悬空指针指向无效内存(通常可以统一称为野指针),空指针则明确不指向任何内存,而内存泄漏则是未释放的有效内存,三者均可能导致程序错误和性能问题。原创 2025-02-13 16:10:12 · 529 阅读 · 0 评论 -
Windows7下安装Visual Studio2019发生错误的解决办法
起初笔者以为是真的是由于网络不稳定或者是笔者在虚拟机中进行实验安装原因导致的问题,后来由于持续的报网络问题无法下载安装,后来只能寄希望于离线安装包了,痛下决心下了将近40个G离线安装包,依旧破了一盆冷水,没能安装成功……的时候,却发生了莫名闹心的事情:(整个过程记录如下,假如你也遇到了同样的困难,希望对您能有所帮助),全程很顺利的完成了Visual Studio2019的安装,没有遇到任何困难。安装两个必要的补丁后,重新运行即可成功进行联网下载安装。,以便更好的开展工作,自己于是在自己的笔记本电脑(原创 2024-08-12 17:20:50 · 1454 阅读 · 0 评论 -
深入剖析C++多态的实现与原理-详解 (辛苦三万字,且看且珍惜!)
在虚函数后面写上=0,这个函数就为纯虚函数.纯虚函数只能写声明,不能写函数体.原创 2024-06-30 08:52:30 · 1017 阅读 · 0 评论 -
UE/C++简单功能实现笔记
本篇笔记主要用于记录如何利用C++在虚幻引擎5中实现一些基本的功能需求。目录。原创 2024-06-20 08:21:22 · 346 阅读 · 0 评论 -
CMake个人理解和使用
100编程书屋_孔夫子旧书网前言CMake是一个构建工具,通过它可以很容易创建跨平台的项目。通常使用它构建项目要分两步,通过源代码生成工程文件,通过工程文件构建目标产物(可能是动态库,静态库,也可能是可执行程序)。使用CMake的一个主要优势是在多平台或者多人协作的项目中,开发人员可以根据自己的喜好来使选择IDE,不用受其他人工程配置的影响,它有点像跨平台的IDE,通过它配置好相关设置之后,可以在多个平台无缝衔接,提高开发效率。最简单的CMake工程项目搭建一个用CMake来管理的项目,其项目根目录通常原创 2024-06-20 08:14:29 · 660 阅读 · 0 评论 -
C++面试八股文:什么是左值,什么是右值?
一次移动(当元素特别多时,移动的成本相对于拷贝基本可以忽略不记),一次析构。二师兄:移动构造是通过移动构造函数实现的,当类有资源需要管理时,拷贝构造会把资源复制一份,而移动构造偷走了原对象的资源。这里的确是通过static_cast实现的,讲左值强行转换成右值,用来匹配移动语义而非拷贝。时,为了保证程序的正确性,编译器可能会采用拷贝构造的方式实现移动构造,从而导致效率降低。是左值是和右值是匹配不同的实现,完成返回不同类型引用的目的。当传入的参数t的类型时右值时,由于引用折叠还是右值,此时的。原创 2024-06-20 07:54:11 · 638 阅读 · 0 评论 -
C++面试八股文:static和const的关键字有哪些用法?
关键字主要用在以下三个方面:1.用在全局作用域,修饰的变量或者函数为静态的,限制在本文件内使用。3.内类修饰成员函数和成员变量,此函数或变量由类持有,而非类的对象持有。修饰的函数是否在编译器求值要取决于传入的参数是不是编译器确定的,这属于元编程的范畴。常量指针的指针部分可变,指针指向的内容不可变。指针常量则相反,指针指向的内容可变,指针不可变。当使用consteval修饰函数和变量时,如果不能在编译时求值,则编译错误。如果传入的参数是编译时确定的,关键字只能用于静态变量的初始化,不能用于动态变量的初始化。原创 2024-06-07 07:24:33 · 612 阅读 · 0 评论 -
vs中.\ 与 ..\ 区别
需要注意的是,在跨平台开发中,应该避免硬编码路径分隔符和使用特定的路径表示方式。应该使用跨平台的路径处理函数来确保代码可以在不同操作系统上正确运行。则代表上一级目录,通常用于访问父目录中的文件或目录。因此,它们在路径表示中的含义和使用场景也是不同的。表示上一级目录(即父目录)下的文件 "file.txt"。代表当前目录,通常用于在当前目录下查找文件或目录,而。表示当前目录下的文件 "file.txt"。在 Visual Studio 中,在路径表示中的作用是不同的。是表示相对路径的两个特殊符号。原创 2024-06-03 08:06:15 · 1151 阅读 · 0 评论 -
C++面试八股文:如何在堆上和栈上分配一块内存?
而new一般伴随三个动作,向操作系统申请一块内存,并执行类型的默认构造函数,然后返回类的指针。我们都知道new和delete成对出现,new[]和delete[]也是成对出现,那么我想问,如果使用new[]创建的对象用delete释放了会发生什么?我们都知道C++中的内存管理是一个比较麻烦的事情,现在有个需求,需要在程序中记录主动申请的内存和主动释放的内存,以确保没有发生内存泄漏。面试官:(笑)好吧,最后一个问题,咱们上面一直在讨论堆中的内存的分配和释放,请问一下,如果在栈上分配一块固定的内存?原创 2024-06-02 08:49:35 · 456 阅读 · 0 评论 -
C++面试八股文:struct、class和union有哪些区别?
当我们给us赋值1时,如果是大端,内存中的数据应该是这样的:0x00,0x01,这时候如果取uc的值,只能取到0x00。如果是小端,内存中的数据应该是0x01,0x00,此时取到的uc的值是0x01,返回1(true)。struct默认的成员是public的,而class的默认成员是private的。union实例的所有成员共享一块内存,这块内存的大小等同于union中成员尺寸最大的一个。对于一个IP地址,要么是IPV4要么是IPV6,IPV4和IPV6是互斥的,那么肯定有一块空间是被浪费了。原创 2024-06-02 08:40:39 · 294 阅读 · 0 评论 -
Rocksdb原理简介
MANIFEST包含了两个文件,一个log文件一个包含最新MANIFEST文件名的文件,Manifest的log文件名是这样 MANIFEST-(seq number),这个seq会一直增长.只有当 超过了指定的大小之后,MANIFEST会刷新一个新的文件,当新的文件刷新到磁盘(并且文件名更新)之后,老的文件会被删除掉。所有的WAL文件都是保存在WAL目录(options.wal_dir),为了保证数据的状态,所有的WAL文件的名字都是按照顺序的(log_number)。原创 2024-05-29 07:08:03 · 953 阅读 · 0 评论 -
【重学C++】05 | 说透右值引用、移动语义、完美转发(下)
假设我们要写一个工厂函数,该工厂函数负责创建一个对象,并返回该对象的智能指针。X(int a) {对于类X的调用方来说,应该与是完全一样的。也就是说,工厂函数factory_v1对调用者是透明的。传给factory_v1的入参arg能够完完整整(包括引用属性、const属性等)得传给T的构造函数。工厂函数factory_v1没有额外的副作用。这个就是C++的完美转发。单看factory_v1应用到X1。原创 2024-05-26 08:05:53 · 1090 阅读 · 0 评论 -
【重学C++】04 | 说透C++右值引用、移动语义、完美转发(上)
今天我们主要学了C++中右值引用的相关概念和应用场景,并花了很大篇幅讲解移动语义及其相关实现。右值引用主要解决实现移动语义和完美转发的问题。我们下节接着讲解右值是如何实现完美转发。欢迎关注,及时收到推送~原创 2024-05-24 14:57:50 · 910 阅读 · 0 评论 -
【重学C++】03 | 手撸C++智能指针实战教程
大家好,今天是【重学C++】的第三讲,书接上回,第二讲《02 脱离指针陷阱:深入浅出 C++ 智能指针》介绍了C++智能指针的一些使用方法和基本原理。今天,我们自己动手,从0到1实现一下自己的unique_ptr和shared_ptr。这一讲我们从AutoIntPtr出发,先是将类进行模版化,使其能够管理任何类型的指针对象,并给该类起了一个更抽象、更贴切的名称——smart_ptr。接着围绕着「如何正确释放资源对象指针」的问题,一步步手撸了两个智能指针 ——和。原创 2024-05-24 14:42:43 · 457 阅读 · 0 评论 -
【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针
大家好,今天是【重学C++】系列的第二讲,我们来聊聊C++的智能指针。避免手动管理内存带来的繁琐和容易出错的问题。unique_ptrshared_ptr和weak_ptr。每种智能指针都有各自的使用场景。unique_ptr用于管理独占式所有权的对象,它不能拷贝但可以移动,是最轻量级和最快的智能指针。shared_ptr用于管理多个对象共享所有权的情况,它可以拷贝和移动。weak_ptr则是用来解决shared_ptr循环引用的问题。下一节,我们将自己动手,从零实现一个C++智能指针。敬请期待!原创 2024-05-23 09:04:54 · 1171 阅读 · 0 评论 -
C++ 如何快速实现一个容器的迭代器
从定义不难看出,迭代器是一个泛化的指针。原创 2024-05-21 14:24:08 · 840 阅读 · 0 评论 -
c++函数参数和返回值
一般如果是 简单结构体,用 返回一个临时对象的方式解决。如果使用 返回一个参数指针,一般改成返回一个id,用一个manager来管理内存机制。或者 共享内存,内存池来解决内存泄露后续的问题用 参数引用来返回的话,一般会这么定义函数返回值,用来返回状态码,真正的数据,放到 result 中。原创 2024-05-15 11:38:51 · 713 阅读 · 0 评论 -
都说 C++ 没有 GC(垃圾回收),RAII: 那么我算个啥?
学过 Java、C# 或者其他托管语言(managed languages)的同学,回过头来看 C++ 的时候,第一反应就是 C++ 没有自动垃圾回收器(GC),而不能充分利用的资源被称为垃圾。那么 C++ 真的不能自动回收垃圾吗?带着这个疑问我们来看看一般 C++ 程序都是怎样回收资源的。这段示例代码在 function() 函数开始的时候申请了一块内存,大小对应于 int 类型,然后在函数结束的时候释放它。通常来说,这看起来很OK,没毛病,但是,如果遇到了下面几种情况呢?原创 2024-05-15 10:51:13 · 965 阅读 · 0 评论 -
C++ 初始化列表构造函数VS普通构造函数
对于一个类而言,只要其中包含有初始化列表的构造函数,编译器在编译使用{}语法的构造时会最倾向于调用初始化列表构造函数,哪怕做类型转换也在所不惜,哪怕有类型最佳匹配的普通构造函数或移动构造函数也会被劫持。假如{}内是空的,类中既有默认构造函数,也有初始化列表构造函数,此时{}会被视为没有实参,而不是一个空的初始化列表,因此会调用默认构造函数。如果就是想调用初始化列表构造函数,这应该使用{{}}的方式。只有在没有办法把{}中实参的类型转化为初始化列表时,编译器才会回到正常的函数决议流程中。原创 2024-05-13 08:52:22 · 388 阅读 · 0 评论 -
C++ requires关键字简介
是 C++20 中引入的一个新关键字,用于在函数模板或类模板中声明所需的一组语义要求,它可以用来限制模板参数,类似于。关键字仅能用于函数模板和类模板中,不能用于非模板函数和非模板类。关键字的语义要求必须在编译时可验证,否则将引发编译时错误。条件,代表由其修饰的函数/类的模板参数合法,可以正常使用。头文件下类型检查函数匹配使用,当。关键字限制函数模板参数。关键字限制类模板参数。原创 2024-05-12 12:21:18 · 878 阅读 · 0 评论 -
C++的拓扑排序实现
/0:白色节点(未发现),1:灰色节点(发现),2:黑色节点(完毕)return false;< 如果遇到了灰色节点,则表示发现了环。//标记为灰色节点(未发现)return false;< 后继节点包含环,返回false。//标记为黑色节点(已完成)class TopologicalSort//!//遇到环,则返回false。// 将所有节点的颜色标记为白色(未发现)// 拓扑排列(完成时间晚的放到前面)// 对每个白色节点进行深搜。原创 2024-04-19 08:06:25 · 435 阅读 · 0 评论 -
网络流的C++代码实现与过程讲解
网络流算法是通过将图中的边看作流量通道,将图的点看作流量的起点或终点,来求解图中的最大或最小流量的问题。它是一种非常重要的最优化算法,广泛应用于图论、运筹学、计算机网络等领域。网络流算法有很多种,其中最著名的是Ford-Fulkerson算法和Edmonds-Karp算法。这两种算法都使用了增广路径来寻找最大流量。本文将介绍Ford-Fulkerson算法的实现。原创 2024-04-19 08:03:53 · 526 阅读 · 0 评论 -
OpenFoam——案例之圆柱绕流【算例】
目前通过在 3 维中定义网格来处理 2 维几何,其中前平面和后平面定义为空边界块类型。读取二维 Fluent 网格时,转换器会自动在第三方向拉伸网格并添加空面片,将其命名为 frontAndBackPlanes。zeroGradient只表示在边界上梯度不变,并不是不随时间变化。uniform (0 0 0)更强硬一些,就是为某个值。:读取fluent.msh网格文件。本案例使用ICEM划分网格,并导入openfoam中。system/blockMeshDict文件可以删除。这是转换网格后自动生成的。原创 2024-04-17 08:24:44 · 1623 阅读 · 0 评论 -
openmp中的任务(task)
Single选中的那个线程会在for循环中不停地创建任务,每一次循环就创建一个任务,这个任务被放入线程池(注意!这个任务不是被single的这个线程执行,而是先被放入任务池)。在不附加何限制的情况下, 这些任务将放入到任务池中, 由空闲的线程取出执行, 如上图所示。换言之, 任务的默认执行顺序是未指定的、随机的。一般而言, 通常使用指令single 利用一个线程创建任务(single 子句保证只有一个线程进行创建任务)。这些任务在创建后, 将被放入到任务池, 供线程组中空闲的线程获取和执行。原创 2024-04-12 10:43:15 · 1254 阅读 · 1 评论 -
C++指针详解
指针是一个整数,一种存储内存地址的数字内存就像一条线性的线,在这条街上的每一个房子都有一个号码和地址类似比喻成电脑,这条街上每一个房子的地址是一个字节我们需要能够准确找到这些地址的方法,用来读写操作因此,指针就是这些地址。不要考虑类型,无论是什么类型的指针,都是用来保存地址的整数。原创 2024-01-08 10:35:25 · 824 阅读 · 0 评论 -
C++ TinyWebserver 部署到Linux下,并运行(使用的是Vmware的虚拟机运行Ubuntu20.04)
2. 首先进行mysql5.7的安装: 参考教程 : Ubuntu20.04安装MySQL5.7-实测3种方法(保姆级教程):https://blog.youkuaiyun.com/liuhuango123/article/details/128264867,3. 装好mysql后项目开始,按照TinyWebserver 中 readme中介绍,一步一步来,(也参考这个教程:https://blog.youkuaiyun.com/weixin_43330388/article/details/106222189)原创 2024-01-08 10:25:18 · 719 阅读 · 0 评论 -
C++移动构造与std::move()
程序定义了一个MyString类,其中构造函数和拷贝构造函数需要对传进来的字符串开辟空间并复制内容,另外一个Entity类含有一个MyString成员,并在初始化时复制传入的MyString对象。此为移动构造,接受的是一个右值,构造是直接复制原MyString的size与data,不重新开辟空间做深拷贝。用此引出移动构造和std::move()1. Entity右值构造时也可不使用std::move,直接将参数强转为右值类型也可以,std::move相当于通知构造函数以移动构造的方式进行。原创 2023-12-26 08:16:24 · 606 阅读 · 0 评论