- 博客(46)
- 收藏
- 关注
原创 C and C++ 八股文
可以看到fun函数中pa ,pb之间互相引用,两个资源的引用计数为2,当要跳出函数时,智能指针pa,pb析构时两个资源引用计数会减一,但是两者引用计数还是为1,导致跳出函数时资源没有被释放(A B的析构函数没有被调用),如果把其中一个改为weak_ptr就可以了,我们把类A里面的shared_ptr pb_;运行结果如下,这样的话,资源B的引用开始就只有1,当pb析构时,B的计数变为0,B得到释放,B释放的同时也会使A的计数减一,同时pa析构时使A的计数减一,那么A的计数为0,A得到释放。
2025-12-04 17:00:00
907
原创 C and C++ 八股文
这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。C++中的struct定义必须百分百地保证与C语言中的struct的向下兼容性,把C++中的最基本的对象单元规定为class而不是struct,就是为了避免各种兼容性要求的限制。常量指针是指定义了一个指针,这个指针指向一个只读的对象,不能通过常量指针来改变这个对象的值。没有提及后面这两个函数。
2025-12-04 08:37:14
436
原创 C / C++ 面试题
栈由编译器自动分 配释放 ,存放函数的参数值,局部变量的值等。操作对象不同,strcpy 的两个操作对象均为字符串,sprintf 的操作源对象可以是多种数据类型, 目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。define 是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量消失,所占据的内存释放。
2025-12-03 08:15:32
413
原创 C and C++
默认情况下,按自然对齐条件分配空间。可以,用const和volatile同时修饰变量,表示这个变量在程序内部是只读的,不能改变的,只在程序外部条件变化下改变,并且编译器不会优化这个变量。许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,而这个k则被称为该数据类型的对齐模数。:编程时 static 的记忆性,和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而 C++的静态成员则可以在多个对象实例间进行通信,传递信息。
2025-12-02 19:38:57
470
原创 数据库编程 面试
2. Oracle Database:它具有强大的功能和高性能,并且支持大规模的数据处理。特点:数据以文档的形式存储,每个文档可以是一个JSON、XML等格式的数据结构。特点:专门用于存储和处理时间序列数据,如传感器数据、日志数据等。特点:数据以对象的形式存储,适合面向对象的应用程序和数据模型。特点:数据以列族的形式存储,适合大规模数据存储和分布式系统。特点:数据以键值对的形式存储,适合快速读写操作和缓存需求。特点:数据以图形结构存储,适合处理复杂的关系和网络数据。
2025-12-01 09:19:27
302
原创 高频面试题:进程与线程1.0
在第3步中,fork函数不是由父进程来执行,而是由子进程来执行,当父进程执行完_CLONE函数后,子进程会执行fork函数的剩余部分,执行最后这个语句,fork函数就会有第二次返回,如果成功就返回0,失败就返回-1。前2步是父进程通过fork函数创建子进程的步骤,在执行完_CLONE函数后,fork函数会有第一次返回,子进程的pid会返回给父进程。4.多个进程同时执行时,如果一个进程崩溃,一般不会影响其他进程,而同一进程内的多个线程之间,如果一个线程崩溃,很可能使得整个进程崩溃。
2025-11-17 21:14:32
403
原创 数据结构 2.0
3、结点数量:如果一棵有n个结点的二叉树的层序遍历序列的结点编号为1~n,且所有编号为i的结点都有左孩子(2i)和右孩子(2i+1),当且仅当所有编号为i的结点(i>1)都有兄弟结点(编号为i的结点的右孩子结点存在,即2*i+1<=n),则该二叉树为完全二叉树。1、满二叉树:对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。此外,满二叉树的结点要么是叶子结点(度为0),要么是度为2的结点,不存在度为1的结点。
2025-11-16 19:30:00
339
原创 数据结构1.0 面试题
什么是B树和B+树,它们有什么区别 "B树和B+树都是自平衡的树状数据结构,它们被广泛应用于文件系统和数据库中,用于存储和管理大量数据的索引结构。1、背包问题:在给定一系列物品,每种物品都有自己的重量和价值,以及一个背包的最大承重能力的情况下,如何选择物品放入背包,使得背包内物品的总价值最大,同时不超过背包的承重能力。分支结点的构造:B+树的分支结点仅仅存储着关键字信息和儿子的指针(这里的指针指的是磁盘块的偏移量),也就是说内部结点仅仅包含着索引信息。问题的最优解可以由其子问题的最优解推导得到。
2025-11-16 13:42:23
399
原创 高频Linux 面试题
这些算法各有特点,最佳置换算法选择下一次访问时间最长的页面进行置换,先进先出置换算法选择最先进入内存的页面进行置换,最近最久未使用置换算法选择最长时间未被访问的页面进行置换,而时钟置换算法则是基于环形链表的算法,通过检查页面的访问位来进行置换。这是因为处于用户态的程序没有直接访问硬件和某些受保护内存的权限,这样的设计主要是为了系统的安全和稳定。(3)一个Program头指向一个Segment,Program头中包括所指向Segment的类型、其在ELF文件中的偏移地址、大小,映射到内存的虚拟地址等信息。
2025-11-13 19:20:20
388
原创 C++ 继承 进阶
问题:当⼦类与⽗类出现同名成员(成员变量或者成员函数),如果通过⼦类对象,访问到⼦类或者⽗类中的同名数据?⼦类构造时会⾃动调⽤⽗类构造函数,有以下三种情况:隐式调⽤(默认,调⽤⽗类⽆参构造)显⽰调⽤⽗类构造函数。隐藏: 继承中,当⼦类与⽗类拥有同名成员函数,⼦类会隐藏⽗类中所有版本的同名成员函。访问⼦类同名成员:直接访问即可(就近原则)访问⽗类同名成员:需要加作⽤域(当子类与父类拥有同名成员函数,子类会隐藏父类中所有版本的同名成员函数。① ⼦类对象可以直接访问到⼦类中同名成员。
2025-11-10 11:29:51
397
1
原创 C++初始继承,继承中构造、析构顺序
⼦类),⼦类可复⽤⽗类的成员并扩展新功能,减少代码冗余。)简单来说,继承就像:⼉⼦会继承⽗亲的某些特征(如眼睛颜⾊、⾝⾼)学⽣是⼈的⼀种,会继承。代码复⽤:减少重复代码,⽗类的成员可被多个⼦类共享扩展⽅便:⼦类可在⽗类基础上新增功能,⽆需修改⽗类代码。例如我们看到很多⽹站中,都有公共的头部,公共的底部,甚⾄公共的左侧列表,只有中⼼内容不同。总结:继承中 先调⽤⽗类构造函数,再调⽤⼦类构造函数,析构顺序和构造相反。⼦类继承⽗类后,当创建⼦类对象的时候,也会调⽤⽗类构造函数。派⽣类)继承另⼀个类(⽗类。
2025-11-09 20:30:06
604
原创 C++ this指针、常函数、内联函数
类的成员函数:在类内部定义的成员函数会被⾃动视为内联函数,⽆需显式添加 inline 关键字。1. 消除函数调⽤开销:编译器会将内联函数的代码直接插⼊到调⽤它的地⽅,避免了函数调⽤时的栈操作、跳转等开销。在 C++ 中,内联函数(Inline Function)是⼀种特殊的函数,它可以在编译时被嵌⼊到调⽤它的代。this 指针是C++提供的隐含在⾮静态成员函数中的指针,指向当前调⽤函数的对象,⽤于区分不同对象的成员。// mA = 10;特性:常对象只能调⽤常函数,不能调⽤普通成员函数(避免修改成员变量)
2025-11-07 21:00:00
554
原创 C++ 静态成员、成员 变量/函数,
静态成员变量:所有对象共享同⼀份数据在编译阶段分配内存类内声明,类外初始化。静态成员函数: 所有对象共享同⼀个函数 静态成员函数只能访问静态成员变量。析构:与构造顺序相反,先调⽤本类析构函数,再调⽤对象成员的析构函数。成员函数(静态和⾮静态):不属于任何对象,所有对象共享同⼀函数实例。当⼀个类的成员是另⼀个类的对象时,称该成员为对象成员。构造:先调⽤对象成员的构造函数,再调⽤本类构造函数。静态成员就是在成员变量和成员函数前加上关键字。静态成员变量:不属于任何对象,存放在全局区。静态成员函数(不占对象空间)
2025-11-07 16:22:04
527
原创 类的嵌套 、封装
封装是将对象的属性和⽅法捆绑在⼀起,隐藏内部实现细节,仅通过公有接⼝与外部交互。⽀持在⼀个类内部定义另⼀个类(内部类),内部类的作⽤域仅限于外部类。保护访问属性,在外部类的类外,想访问到内部类,只能通过外部类内。内部类如果是公有访问属性,在外部类的类外,可以通过。权限的成员仅能在类内部访问,类外⽆法直接访问(类的嵌套相当于给内部类设置了⼀层作⽤域。权限的成员在类内部和类外部都可以直接访问。公有权限:类的内部以及类的外部都可访问。私有的成员变量,只能在当前类内部访问。公有权限,类内部和类外部均可访问。
2025-11-06 20:30:00
687
原创 零基础 C++ 构造、析构、深浅拷贝
可重载(⽀持多个参数不同的构造函数)对象实例化时⾃动调⽤,且仅调⽤⼀次若未显⽰定义,编译器会提供默认⽆参构造函数(空实现)若显⽰定义了构造函数,编译器不在提供默认的⽆参构造函数。仅复制对象的表层数据(如基本类型)对于指针成员,仅复制指针地址(源对象和⽬标对象的该指针成员共享同⼀块内存)问题:可能导致重复释放内存。不仅复制表层数据,还复制指针指向的堆内存数据指针成员各⾃拥有独⽴的内存解决浅拷⻉的内存问题,需⼿动实现拷⻉构造和赋值运算符重载。若定义了有参构造,编译器不再提供默认⽆参构造(需⼿动定义)
2025-11-06 16:56:51
509
原创 初识C++面向对象,命名空间
编程⻆度:具有特定类型的变量,包含属性(数据)和⾏为(⽅法),类似于⼀阶段通过结构体创建的结构体变量。对象实例化是为对象分配内存并创建具体对象的过程,分配空间的⼤⼩往往取决于类中数据成员,,通过对象的属性(数据)和⾏为(⽅法)来描述事物,并通过对象之间的交互完成复杂功能。封装:将数据和操作数据的⽅法捆绑在⼀起,隐藏内部实现细节,仅对外暴露接⼝。⽀持在⼀个类内部定义另⼀个类(内部类),内部类的作⽤域仅限于外部类。,规定了对象的属性和⽅法,类似于⼀阶段的结构体的定义。方法(动态行为,写在类中的函数称之为方法)
2025-11-06 14:37:29
259
原创 C++ 中string的用法
核⼼⽤法展开,结合代码⽰例解析关键功能,覆盖初始化、转换、输⼊输出、容量。规则:以(空格、制表符、换⾏符)为分隔符,仅读取第⼀个分隔符前的内容。功能:在当前字符串末尾追加内容,直接修改原对象(⽆临时对象,效率⾼)中任意⼀个字符最后⼀次出现的位置(⾮完整匹配,⽽是字符集匹配)。⻛格字符串),具有⾃动内存管理、丰富的成员函数、类型安全等优。对象的内容,效率极⾼(仅交换内部指针和容量,不拷⻉数据)。)提供的字符串处理类,封装了字符串的存储、修改、查找等功。(完整匹配)第⼀次出现的位置,返回索引;
2025-11-05 18:31:52
1033
原创 函数默认参数与String
注意:返回值类型不同不能作为重载条件(会导致调⽤歧义),也就是函数重载跟返回值类型⽆。注意:返回值类型不同不能作为重载条件(会导致调⽤歧义),也就是函数重载跟返回值类型⽆。允许给函数形参设置默认值,调⽤时若不传递该参数,则使⽤默认值。若某个参数有默认值,其右侧的所有参数必须也有默认值(避免歧义)⽤途:后续学习操作符重载时有可能⽤到,⽤于匹配特定的参数形式。只有类型,没有名称),调⽤是必须传递对应类型的参数。同⼀⽂件内),函数名相同但参数列表不同的多个函数,同⼀⽂件内),函数名相同但参数列表不同的多个函数,
2025-11-04 20:52:15
506
原创 C++引用
作⽤:让形参直接关联实参,避免值传递的内存拷⻉(传参过程中不会产⽣额外的内存空间),且。编译器会⾃动将引⽤操作转换为指针操作,因此引⽤的语法更简洁,但本质和指针类。初始化后不可更改绑定对象:引⽤⼀旦绑定某个变量,就不能在座位其他变量的别名(但可以。规则:不要返回局部变量的引⽤(局部变量在函数调⽤结束后释放,引⽤会成为野指针)。作⽤:防⽌通过引⽤修改原变量(⽤于保护实参),通常修饰函数形参。引⽤是变量的别名,操作引⽤等同于操作原变量(共享同⼀块内存)。修改引⽤的值,也就是修改原变量的值)
2025-11-04 17:11:06
419
原创 终端字体颜色设置
*主要格式如下:"\033[代码;字体颜色m字符串\033[0m"35 45 紫紅色。1 1 透明色。4 下划线(underline)22 设置一般密度(非粗体)8 消隐(不可见)24 关闭下划线。1 高亮显示。
2025-11-02 18:15:11
415
原创 数据库编程
mysql> insert into 表名 [(字段1,字段2,...)] values (值11,值12,...),(值21,值22,...)...;mysql> select 字段1,字段2,... from 表名 where 字段 in (值1,值2,...);mysql> select 字段1,字段2,... from 表名 where 字段 not in (值1,值2,...);mysql> select 字段1,... from 表1 [inner] join 表2 on 连接条件。
2025-10-30 19:00:06
467
原创 基于Linux.网络编程
函数原型: int sendto(int sockfd,const void* buf,int size,int flags,函数原型: int recvfrom(int sockfd,void* buf,int size,int flags,函数原型: int send(int sockfd,const void* buf,int size,int flags);函数原型: int recv(int sockfd,void* buf,int size,int flags);
2025-10-30 18:59:27
266
原创 线程属性信息
在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束。通俗的说也就是:我们知道一般我们要等待(pthread_join)一个线程的结束,主要是想知道它的结束状态,否则等待一般是没有什么意义的!sched_get_priority_max和sched_get_priority_min得到!POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,PTHREAD_INHERIT_SCHED: 新的线程继承创建线程的策略和参数!
2025-10-29 19:11:01
420
原创 Linux 系统开发
函数原型: void* mmap(void* addr,int length,int prot,int flags,int fd,off_t offset);函数原型: ssize_t write(int fd,const void* buf,size_t count);函数原型: ssize_t read(int fd,void* buf,size_t count);函数原型: off_t lseek(int fd,off_t offset,int whence);
2025-10-29 19:10:23
764
原创 线程同步与互斥
函数原型: int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t* attr);函数原型: int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t* mutex);该问题的核心是:保证生产者线程在共享缓冲区满容量的时候不允许访问,函数原型: int pthread_mutex_unlock(pthread_mutex_t *mutex);
2025-10-28 16:30:00
870
原创 多线程程序
函数原型: int pthread_create(pthread_t id,const pthread_attr_t* attr,函数原型: void pthread_cleanup_push(void(*clear)(void*),void* argp);函数原型: int pthread_attr_destroy(pthread_attr_t *attr);函数原型: int pthread_attr_init(pthread_attr_t *attr);
2025-10-28 11:20:29
318
原创 .Linux 系统开发
函数原型: void* mmap(void* addr,int length,int prot,int flags,int fd,off_t offset);函数原型: ssize_t write(int fd,const void* buf,size_t count);函数原型: ssize_t read(int fd,void* buf,size_t count);函数原型: off_t lseek(int fd,off_t offset,int whence);
2025-10-27 20:50:27
753
原创 .目录操作:
函数原型: int rename(const char* oldpath,const char* newpath);函数原型: int mkdir(const char* directory,mode_t mode);函数原型: DIR* opendir(const char* dirpath);函数原型: int remove(const char* directory);函数原型: struct dirent* readdir(DIR* dir);
2025-10-27 13:49:11
567
原创 IPC进程间通讯
函数原型: int msgrcv(int msgid,void* msgp,size_t msglen,long msgtype,int msgflg);函数原型: int msgsnd(int msgid,const void* msgp,size_t msglen,int msgflg);函数原型: int semctl(int semid, int semnum, int cmd, ...);2. ftok函数的返回值。
2025-10-27 09:09:40
603
1
原创 进程间通讯
函数原型: int msgrcv(int msgid,void* msgp,size_t msglen,long msgtype,int msgflg);函数原型: int msgsnd(int msgid,const void* msgp,size_t msglen,int msgflg);函数原型: int semctl(int semid, int semnum, int cmd, ...);2. ftok函数的返回值。
2025-10-24 16:26:01
782
原创 工程管理与调试
例子: $(patsubst %.c,%.o,$(SRCS)) //匹配 src目录下所有的源文件。make (工程管理器):也被称为自动编译管理器,之所以称为"自动",是因为make可以根据文件的时间戳,Makefile 可以根据指定的 *.o 文件找到同名的源文件,并帮我们自动生成 *.o 文件。1. 因为目标文件(*.o)是由Makefile内部生成,如果我们在生成目标文件的同时,想指定。引入问题: 大家都明白,对于一个复杂的工程项目来说,往往是由非常多的工程文件组成的,如果。
2025-10-23 16:10:46
308
原创 C语言构造函数
2.在满足1的条件下,最终的结构体大小要满足最大成员的所占内存单元的整数倍。struct info std = {成员1的数据,成员2的数据...};1.首先保证结构体中的成员存储在自身对齐边界(当前类型的整数倍)。struct info------结构体这种类型名字。可以将不同的数据作为数据项合成一个整体,我们就称这个整体叫结构体。整体进行操作的,只能通过成员访问的方式来进行结构体变量的使用。数据类型,这个时候就可以当做系统中已经定义的类型那样去使用。注意事项:info-----------结构体名字。
2025-10-22 18:15:07
538
1
原创 心血之作:C语言数据结构
3) 中间插入 int slist_insert(node_t** head,data_t pos,data_t newdata);3) 中间插入 int dlist_insert(node_t** head,data_t pos,data_t newdata);2.1 如果待删除的结点具有左子树,则在左子树中查找数据最大的结点;2) 尾插: int slist_addtail(node_t** ,data_t);4.双亲/孩子: 某结点的后继结点称为该结点的孩子,该结点称为孩子结点的双亲。
2025-10-22 15:57:46
810
原创 文件流操作
函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);函数原型: size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);函数原型:char *fgets(char *s, int size, FILE *stream);函数原型:int fputs(const char *s, FILE *stream);
2025-10-21 16:56:08
354
原创 C语言 : 函数
递归调用本质:是一种循环结构,但是不同于while(),do...while(),for()的循环。结构,while(),do...while(),for()这样的循环一般是借助循环变量来实现;extern 修饰,可以省略,一般写的都是外部函数,可以被其他文件中的函数调用。但是需要注意传过去的不是整个数组元素,而是数组的首地址(第一个元素的地址),形参接收。嵌套调用的含义:在被调函数里面又主动的调用其他函数,这样的调用方式,称为。递归调用的含义:在一个函数内部,直接或间接的调用函数本身,称为递归调用。
2025-10-20 14:41:02
766
原创 库文件生成与使用
动态库的名字一般格式为 libxxxxx.so.major.minor , 其中 xxxx 代表库文件名,major代表主版本号,共享库的代码是在可执行程序运行时由系统载入内存共可执行程序使用,在编译时仅提供简单的符号引用,因此。两者的不同点在于代码被载入的时机不同,静态库的代码时在编译链接过程中被复制到最终的可执行程序中,因此链接了共享库的可执行程序往往体积比较小,但当交付可执行程序时,共享库要一起交付。静态库的名字一般格式为 libxxxxx.a , 其中 xxxx 代表库文件名。
2025-10-19 20:28:20
372
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅