C++学习
山有木兮啊
这个作者很懒,什么都没留下…
展开
-
记一次空指针引发的段错误
空指针很容易发生段错误,但是当使用空指针指向一个不访问成员变量的成员函数时是不会发生段错误。所以后面如果在此成员函数中加入访问成员变量的逻辑时会引发段错误。如图当我使用空指针调用addEvent时触发了段错误,这是出现段错误时的函数栈。由于每次在pthread_mutex_lock这个函数出现问题,后来我就在这个Mutex类内加入日志,把pthread_mutex_t这个变量的地址打印了出来,地址为0x8,很明显可以看出这个地址有问题。然后猜想时不是这个类提前析构导致的,就在此类的析构函数加入了日志原创 2021-11-29 22:11:02 · 646 阅读 · 0 评论 -
【无标题】
/************************************************************************* > File Name: icmp.cpp > Author: hsz > Brief: > Created Time: Mon 15 Nov 2021 06:19:56 PM CST ***********************************************************原创 2021-11-17 16:35:19 · 197 阅读 · 0 评论 -
进程间通信及同步
1、pipe(无名管道)(最简单,仅支持有血缘关系的)半双工通信#include <unistd.h>int pipe(int pipefd[2]);// pipefd 读写描述符, fd[0]代表读 fd[1]代表写// 返回值:成功返回-1 成功返回0// 创建管道在fork之前#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h&g原创 2021-11-14 18:20:15 · 1307 阅读 · 0 评论 -
进程和线程以及异常信号捕获堆栈
进程和线程进程是管理者由task_struct进行统一管理其实一个进程对应着一个task_struct线程是真实处理任务的,单线程来讲,其本身就是一个进程线程有自己的堆栈空间通过ulimit -a可以看到线程栈空间的限制为8192kb所以当你创建一个线程时会开辟出自己的空间,线程之间访问内存是由task_struct实现的。所以一个进程内的线程是可以访问另外一个线程的变量(锁暂且不提)下面在来说下异常捕获捕获异常需要注册信号最简单的是signal函数signal(int, void原创 2021-11-05 14:10:29 · 296 阅读 · 0 评论 -
epoll+协程
自己看代码忽略LOG代码,自己实现的日志类,可以替换为printf忽略命令空间,可以把其去掉// fiber.h#ifndef __FIBER_H__#define __FIBER_H__#include <stdio.h>#include <ucontext.h>#include <functional>#include <memory>namespace Jarvis {/** * @brief 协程类 */ class F原创 2021-10-13 17:02:39 · 537 阅读 · 0 评论 -
字符串查找之KMP算法
KMP的历史自行找度娘关于原理可以看下面的链接字符串匹配的KMP算法求解next数组在此,列出我自己对KMP的理解非-1版本传统的字符串匹配方式为一个字符一个字符匹配,这样做效率很低。KMP算法的核心是i相对于父串只增不减,即不会回退。所以不会做重复的事KMP算法的难度在于求解偏移量,而偏移量和要查找的子串及当前匹配的长度息息相关。题:子串key = "abaaaba",求解next数组next数组的index表示什么?表示的是当前子串和父串已经匹配的字符个数,比如: aba...和a原创 2021-09-01 17:34:54 · 179 阅读 · 0 评论 -
C++mysql接口--mysqlclient静态库编译
下载mysqlclient1、sudo apt-get install libmysql++-dev头文件目录:/usr/include/mysql依赖库:/usr/lib/x86_64-linux-gnu/libmysqlclient.a/usr/lib/x86_64-linux-gnu/libmysqlclient.so2、官网下载选择自己的系统下载步入正题如何编译mysqlclient静态库编译之前需要确定mysqlclient依赖哪些动态库使用ldd查看libmysqlcli原创 2021-08-25 17:20:09 · 2450 阅读 · 2 评论 -
C++流总结
前言:学习C++一年多了,这期间一直用的是文件操作fopen、open等,输入输出用的是printf。很少去用fstream iostream等,但是毕竟是一名C++开发人员,所以在此做一下对流类型的总结。流类分类流类名称流类作用流基类ios所有流类的父类,保存流的状态并处理错误输入流类istream输入流基类,将流缓冲区中的数据作格式化和非格式化之间的转换并输入ifstream文件输入流类istream_withassigncin输入流类,即操作转载 2021-08-12 10:23:54 · 72 阅读 · 0 评论 -
CallStack获取函数堆栈
之前总看Android的源码感觉CallStack做的很不错,现在终于用户三方库libunwind做出了自己的CallStack,虽然代码不多,但也是自己写的上代码/************************************************************************* > File Name: callstack.h > Author: hsz > Mail: > Created Time: Tue 27原创 2021-07-28 11:51:18 · 729 阅读 · 0 评论 -
左值引用与右值引用
左值引用左值引用形如int &a; const int &a这两个的区别是什么呢?int &a 只能接收左值,而const int &a既可以是左值也可以是右值,如下#include <stdio.h>void func_1(int &a){ printf("%s(int &a = %d)\n", __func__, a);}void func_2(const int &a){ printf("%s(const原创 2021-07-22 10:18:40 · 240 阅读 · 0 评论 -
C++初始化列表快于构造函数体内初始化
测试用代码#include <iostream>using namespace std;class classA {public: classA() { cout << "classA()" << endl; } classA(const classA& a) { cout << "copy classA()" << endl; } ~classA() { cout << "~classA()"原创 2021-07-05 14:25:11 · 114 阅读 · 0 评论 -
获取Linux内核线程ID
#include <stdio.h>#include <pthread.h>#include <unistd.h>#include <sys/types.h>#include <sys/syscall.h>#define gettid() syscall(__NR_gettid)void *test(void *arg){ printf("pid = %d, tid = %ld\n", getpid(), gettid()原创 2021-04-11 12:09:18 · 330 阅读 · 0 评论 -
C++基础
双冒号 作用域运算符::atk —> 会使用全局stk的值,不带::则根据就近原则命名空间:主要用来解决命名冲突的问题声明:namespace name{ 函数(Func); 变量; 结构体; 类;}调用:name::Func();注意: 命名空间必须定义在全局作用域下命名空间可以嵌套命名空间 -->(逐级查找,先从最外层命名空间查找)重名...原创 2019-11-06 09:28:45 · 139 阅读 · 0 评论