自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(193)
  • 资源 (2)
  • 收藏
  • 关注

原创 C++智能指针详解:shared_ptr

C++没有内存回收机制,每次程序员new出来的对象需要手动delete,流程复杂时可能会漏掉delete,导致内存泄漏。于是C++引入智能指针,可用于动态资源管理,资源即对象的管理策略。使用 raw pointer 管理动态内存时,经常会遇到这样的问题:忘记delete内存,造成内存泄露。 出现异常时,不会执行delete,造成内存泄露。下面的代码解释了,当一个操作发生异常时,会导致delete不会被执行:void func(){ auto ptr = new Widget;

2021-12-19 14:52:26 18542 2

原创 Linux实用gdb结合coredump定位崩溃进程

Windows环境崩溃问题可根据vs调试工具查看,Linux同样可以查看调用堆栈的信息,只是需要更改Linux设置,使程序崩溃时候产生core文件。然后gdb调试即可。1、产生core文件方法产生coredump的条件,首先需要确认当前会话的ulimit –c,若为0,则不会产生对应的coredump,需要进行修改和设置。ulimit -cunlimited (可以产生coredump且不受大小限制),这种设置仅对当前生效,如果想永久生效那么需要在/etc/profile中加入...

2021-08-02 09:16:46 882

原创 C++ 队列deque的特性和用法

Vector 容器是单向开口的连续内存空间,deque 则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector 容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。deque的操作图示deque 容器和 vector 容器最大的差异,一在于 deque 允许使用常数项时间对头端进行元素的插入和删除操作。二在于 deque 没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链...

2021-06-02 19:37:38 720

原创 MySql和Oracle的主要区别有哪些?

(1) 对事务的提交 MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮(2) 分页查询 MySQL是直接在SQL语句中写"select... from ...where...limit x, y",有limit就可以实现分页;而Oracle则是需要用到伪列ROWNUM和嵌套查询(3) 事务隔离级别 MySQL是read commited的隔离级别,而Oracle是repeatable read的隔离级别...

2021-04-26 20:14:20 104

原创 C++11条件变量:notify_one()与notify_all()的区别

notify_one()与notify_all()常用来唤醒阻塞的线程。notify_one():因为只唤醒等待队列中的第一个线程;不存在锁争用,所以能够立即获得锁。其余的线程不会被唤醒,需要等待再次调用notify_one()或者notify_all()。notify_all():会唤醒所有等待队列中阻塞的线程,存在锁争用,只有一个线程能够获得锁。那其余未获取锁的线程接着会怎么样?会阻塞?还是继续尝试获得锁? 答案是会继续尝试获得锁(类似...

2020-11-10 18:55:58 27160 8

原创 C++11异常处理关键字:noexcept

断言(assertion)是一种编程中常用的手段。相比于断言适用于排除逻辑上不可能存在的状态,异常通常是用于逻辑上可能发生的错误。在C++98中,我们看到了一套完整的不同于C的异常处理系统。通过这套异常处理系统,C++拥有了远比C强大的异常处理功能。下面来一起了解一下吧。C++11开始,我们能看到很多代码当中都有关键字noexcept。比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept。 constexpr initializer_list(

2020-11-03 18:33:11 652

原创 C++11:原子交换函数compare_exchange_weak和compare_exchange_strong

我们知道在C++11中引入了mutex和方便优雅的lock_guard。但是有时候我们想要的是性能更高的无锁实现,下面我们来讨论C++11中新增的原子操作类Atomic,我们可以利用它巧妙地实现无锁同步。CAS(Compare and Swap)是个原子操作,保证了如果需要更新的地址没有被他人改动多,那么它可以安全的写入。而这也是我们对于某个数据或者数据结构加锁要保护的内容,保证读写的一致性,不出现dirty data。现在几乎所有的CPU指令都支持CAS的原子操作。AtomicC+...

2020-06-30 10:41:23 39861 11

转载 解决Linux运行程序.so动态库链接不到的问题

这也是安装其他第三方库时最推荐的做法, 编译时直接带上-l选项即可. (安装自己的库就不推荐这种做法了)但是改变环境变量只是改变内存的内容, 关机重启内存中的内容就都不存在了.(具体参考环境变量章节)现在在系统的默认路径中添加该库文件的软链接, 注意要用。

2024-04-01 10:50:32 119

原创 将linux的top命令内容存入日志中

使用top命令并结合grep筛选,将top结果保存到日志中中,方便分析进程对系统资源的占用。-n top执行次数,若不设置,则一直执行,直到手动kill。-d 更新间隔(秒)

2024-03-11 10:04:06 558

转载 Linux查看线程和利用gdb调试多线程

【代码】Linux查看线程和利用gdb调试多线程。

2024-03-11 09:41:11 178

转载 Linux下gdb多线程调试

【代码】Linux下gdb多线程调试。

2024-01-10 18:22:43 152

原创 Linux 5种网络IO模型

1、支持一个进程所能打开的最大连接数select:单个进程所能打开的最大连接数有FD_SETSIZE宏定义,其大小是32个整数的大小(在32位的机器上,大小就是3232,同理64位机器上FD_SETSIZE为3264),当然我们可以对进行修改,然后重新编译内核,但是性能可能会受到影响,这需要进一步的测试。poll:poll本质上和select没有区别,但是它没有最大连接数的限制,原因是它是基于链表来存储的。

2023-08-16 16:55:00 1679

转载 Linux查看端口占用的几种方法

大家在操作linux系统,或者在安装linux软件的时候,应该会经常遇到端口被其他进程占用的问题,下面就列举一下怎么查看linux端口被占用的方法。

2023-08-15 16:11:07 1501

原创 C/C++时间获取函数

包含C/C++中用于获取时间,和时间转换方面的函数。

2023-08-14 14:25:45 1632

转载 UE4_.uproject没有默认关联虚幻编辑器打开

2 把UnrealVersionSelector.exe 拷贝到Ue4的版本工程目录,例如UE_4.18->Engine->Binaries->Win64。1 找到发射器的安装目录,寻找lancher->Engine->Binaries->Win64->UnrealVersionSelector.exe。3 双击运行UnrealVersionSelector.exe 即可,可能会有延迟,重启一下电脑也可。重装系统可能会遇到ue4的工程失去关联,就是所谓的要选择工程的打开方式问题。

2023-07-06 10:18:13 473

转载 UE4/UE5的崩溃,卡死等问题处理

虚幻引擎的业务逻辑开发基本上都是用C++/蓝图,当因为项目代码写的不好遇到Crash等问题时,如果不了解Native程序和引擎底层的一些机制,相比用C#开发业务的Unity或其他完全基于脚本虚拟机的游戏确实要难处理一些。因为业务和引擎代码本身都是基于C++,所以对于解决常规C++的Crash的方法虚幻引擎完全适用,除此外引擎在异常处理上相比于普通的C++程序还是提供了一些额外的方法和工具。本文主要介绍虚幻引擎在处理Crash时的一些做法和经验技巧。

2023-06-20 15:44:22 4015

原创 Linux的top命令内容输出到文件

使用top命令的-b选项可以将输出重定向到文件,-n选项指定top命令输出多少次结束。有时候我们需要查看某个进程在一段时间内CPU和内存的占用信息。

2023-06-08 10:33:59 2427

原创 Linux的.service服务 实现程序开机自启

所有可用的单元文件存放在 /lib/systemd/system/ 和 /etc/systemd/system/ 目录。我们需要在/lib/systemd/system/ 下存放.service文件,当systemctl enable @@@.service 设置了自启动后,会自动在 /etc/systemd/system/ 下创建一个软链接指向 /lib/systemd/system/ 下的文件。通过服务状态可以查看启动服务的.service配置文件。

2023-03-14 15:56:29 2579 1

原创 C++算法题:递归和栈的算法

问题1:跳台阶问题。具体描述,一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间杂度。//相当于从下往上跳,最后剩一个(仅一种跳法)或两个(有两种跳法)+++//函数功能 : 跳台阶问题 //函数参数 : n为台阶个数 //返回值 : 总的跳法 unsigned JumpSteps_Solution1(unsigned n) { if(n <= 2) return n; else

2022-05-12 21:14:24 826

原创 C++算法题:关于树的算法

问题1:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。什么是二元查找树?比如:转换成双向链表的顺序是:1 3 4 6 7 8 10 13 14步骤一:建立二叉搜索树struct BSTreeNode { int value; BSTreeNode *left; BSTreeNode *right; };BSTreeNode * Insert(BSTre...

2022-05-11 22:12:23 804

转载 C++算法题:什么是红黑树?什么是二叉查找树?

知识体系结构¶ 树树是一种数据结构,它是n(n>=0)个节点的有限集。n=0时称为空树。n>0时,有限集的元素构成一个具有层次感的数据结构。区别于线性表一对一的元素关系,树中的节点是一对多的关系。树具有以下特点:n>0时,根节点是唯一的,不可能存在多个根节点。 每个节点有零个至多个子节点;除了根节点外,每个节点有且仅有一个父节点。根节点没有父节点。¶ 树的遍历按照根节点访问的顺序不同,树的遍历分为以下三种:前序遍历,中序遍历,后序...

2022-05-10 22:42:14 617

原创 C++算法题:找环形单链表的环入口

问题1:怎样才能检测到链表中存在循环?书中给出的最终算法是定义两个指针p1,p2,p1每次移动一个位置,而p2每次移动两个位置,这样如果链表中存在循环,那么p2一定能追上p1。如果不存在,那么p2会到达链表尾部,即检测到空//这个算法,并没有找到入口,而是找到了相遇点bool hasCircle(Node* head, Node* &encounter) { Node *fast = head, *slow = head; while(fast &&a

2022-05-10 19:44:00 448

原创 C++算法题:关于链表的算法

单向链表节点结构:struct ListNode { int key; ListNode *next; ListNode(int k = 0, ListNode *p = NULL) { key = k; next = p;} }; 问题1:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。ListNode* ReverseList(ListNode *pHead) { ListNode *pPre = NULL;

2022-05-10 19:15:18 314

原创 C++算法题:关于字符串的算法

问题1:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。思路:先逆转整个句子,然后从首字符开始扫描,每扫描到一个单词(遇到空白或结束字符),对这个单词进行逆转。代码:采用左闭右开的形式void Reverse(char *pBegin, char *pEnd) { if(pBegin == pEnd)

2022-05-08 21:54:04 860

原创 C++算法题:关于数组的算法

1、问题描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。适用于严格递增的数组求这个已经旋转过得数组的最小元素//函数功能 : 旋转数组的最小元素 //函数参数 : pArray指向数组,len为数组长度 //返回值 : 最小元素 int FindMin(int *pArray, int len)

2022-05-08 21:39:43 857

原创 C++算法题:二分查找和取最大公共子串

二分查找(两种实现方法)/**二分查找思想:1、数组从小到大排序;2、查找的key每次和中间数比较,如果key小于mid查找mid左侧的数组部分;如果key大于mid,则查找mid右侧的数组部分;如果相等,则直接返回mid。输入:排序数组-array,数组大小-aSize,查找值-key返回:返回数组中的相应位置,否则返回-1*///非递归查找int BinarySearch(int *array, int aSize, int key){ if ( array == NULL

2022-05-07 20:16:25 232

原创 C++实现几种排序算法

冒泡排序(不断地相邻的比较交换)从小到大排序,比如有5个,先把五个里最小的移到最左边0位置。再把剩下的四个最小的移到1位置......标准的做法是:如果一趟冒泡没有交换,说明顺序已经成型 ,不必再循环 break i 0→ 1→ 2→ 3→ 4→ 5→ 6 j 0 ←1

2022-05-07 19:34:41 4338

原创 UE4创建可破坏物体

1. 创建可破碎物体  首先,启用插件:    然后,选择一个模型,右键,创建可破碎物体:  2. 创建蓝图  把新创建出来的物体创建为蓝图:    击碎物体的蓝图节点:    当然,要把那个物体(图上的Destructible物体)的Hit Event勾上:  3. 相关参数设置  双击创建出来的那个可破碎物体:    其中的参数:Damage Threshold(伤害临界值:受到的伤害超过这个数值时,物体会碎)的

2022-04-07 21:48:57 1543

转载 SSL的工作原理和历史演进

为了保证网络通信的安全性,需要对网络上传递的数据进行加密。现在主流的加密方法就是SSL (Secure Socket Layer),TLS (Transport Layer Security)。后者比前者要新一些,不过在很多场合还是用SSL指代SSL和TLS。先来回顾一下网络通信加密的发展过程,假设A和B之间要网络通信。一、远古时代远古时代自然是民风淳朴,路不拾遗,夜不闭户。A要发数据给B,根本不用担心窃听和篡改,直接发就好了。二、上古时代随着时代的发展,渐渐的有了一类人--

2022-02-07 14:56:36 352

原创 SSL协议运行机制简介

为了保证网络通信的安全性,需要对网络上传递的数据进行加密。现在主流的加密方法就是SSL (Secure Socket Layer),TLS (Transport Layer Security)。后者比前者要新一些,不过在很多场合还是用SSL指代SSL和TLS。本文简要介绍SSL/TLS协议的运行机制。文章的重点是设计思想和运行过程,不涉及具体的实现细节。如果想了解这方面的内容,请参阅RFC文档。一、作用不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。

2022-02-07 14:16:47 264

转载 C++编译时报错 error: unknown type name ‘ ‘

今天项目中,遇到一个很奇怪的问题,明明导入了头文件,却一直说不知道该类型。如类VideoInfo 类存储的是视频 的信息参数,它当作参数,传入 解码器,作为解码器的成员变量,如下:#include <cstdint>#include "IDecode.h" extern "C"{#include "libavformat/avformat.h"#include "libavcodec/avcodec.h"}; class VideoInfo {public: .

2021-12-31 17:09:33 18379

转载 linux编译动态库时,/usr/bin/ld: /usr/local/ssl/lib/libcrypto.a提示recompile with -fPIC

#g++编译动态库时,使用了ssl的静态库/usr/local/ssl/lib/libcrypto.a,结果一直报上面的错误用openssl0.9.8的的源码重新编译该库,还是报同样的错误,网上搜索了一番,发现正确的编译ssl的流程是./config -fPICmakemake install由于一直用的./config直接配置,没有加后面的参数,所以使用时一直报错。其实报错已经提示了缺少-fPIC,但是一直没仔细研究过加上参数后重新编译ssl库,就可以了...

2021-12-19 11:12:42 694

原创 C++智能指针之 auto_ptr和unique_ptr

auto_ptr是用于C++11之前的智能指针。由于 auto_ptr 基于排他所有权模式:两个指针不能指向同一个资源,复制或赋值都会改变资源的所有权。auto_ptr 主要有两大问题:1、复制和赋值会改变资源的所有权,不符合人的直觉。2、在 STL 容器中无法使用auto_ptr ,因为容器内的元素必需支持可复制(copy constructable)和可赋值(assignable)。unique_ptr特性1、拥有它所指向的对象2、 无法进行复制构造,也无法进行复制赋值操作3、保存指

2021-12-19 11:00:56 291

转载 Linux 验证文件完整性md5sum 的用法

MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。MD5全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”),不同的文件产生相 同的报文摘要的可能性是非常非常之小的。在linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序。一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行。可以用下面的命令来获取.

2021-12-16 18:14:02 1652

原创 linux中 ldd命令简介

  Linux中ldd命令主要用于查看程式运行所需的共享库,那么ldd命令具体要如何使用呢?下面就给大家介绍下Linux下ldd命令的使用方法ldd本身不是一个程序,而仅是一个shell脚本:ldd可以列出一个程序所需要得动态链接库(so)我们可以用which命令找到ldd的位置:$ which ldd/usr/bin/ldd注意: 在 ldd 命令打印的结果中,“=>”左边的表示该程序需要连接的共享库之 so 名称,右边表示由 Linux 的共享库系统找到的对应的共享库.

2021-12-09 17:30:49 6206

原创 iOS——Command-Line 查看当前SDK版本并修改默认SDK版本

在工作中可能会碰到用命令行编译、打包iOS应用程序的情况(xcodebuild相关命令)。但是由于SDK版本问题,会报错,说某SDK版本不对,可能是因为升级Xcode导致的SDK版本升级,为了避免高SDK版本对当前代码的稳定性,可以通过修改默认SDK版本来解决。前提是,你需要安装了响应的SDK版本,一般xcode会自带SDK,比如下载就版本的Xcode,就会带有旧版本的SDK。查看SDK版本命令:xcodebuild -showsdks显示如下:  修改sdk版本(前提是我已经

2021-12-09 16:53:34 3304

原创 MacBook系统 pip安装时报错`error: Unsupported architecture`,`error: architecture not supported` 解决办法

新电脑pip安装老是报错,看报错信息好像是CPU架构不兼容,记录一下解决办法以下是报错信息:ERROR: Command errored out with exit status 1: command: /Users/xxiaowei/pyProject/DjangoBlog/venv/bin/python -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/_l/z

2021-12-09 16:25:39 4402 2

转载 gcc/g++ 动态库和静态库,编译与链接(含示例)

程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为“库”文件。在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态(链接)库,其特点是可执行文件中包含了库代码的一份完整拷贝,缺点是被多次使用就会多份冗余拷贝。还有一种库,就是程序在开始运行后调用库函数时才被载入,这种库独立于现有的程序,其本身不可执行,但包含着程序需要调用的一些函数,这种库称为动态(链接)库(Dynamic Link Library)。..

2021-12-09 15:00:05 8747

原创 C++中strcpy()、strncpy()和strcpy_s()区别

1、strcpy()  原型:char *strcpy(char *dst,const char *src)  功能:将以src为首地址的字符串复制到以dst为首地址的字符串,包括'\0'结束符,返回dst地址。要求:src和dst所指内存区域不可以重叠且dst必须有足够的空间来容纳src的字符串,若dst空间不足,编译时并不会报错,但执行时因系统不同会出现不同的结果:Mac系统提示“Abort trap:6”(Mac);CentOS7系统会正常运行(可能是个例,可以正常运行)  测试代码:

2021-11-05 16:28:34 513

转载 C/C++信号量CreateSemaphore的用法

创建或打开命名或未命名的信号量对象。要指定对象的访问掩码,请使用CreateSemaphoreEx函数。语法HANDLE WINAPI CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, _In_ LONG lInitialCount, _In_ LONG lMaximumCount, _In_opt_ LPCTSTR lpName);参数:lpSemaphoreAttribut...

2021-11-01 19:07:30 2300

vc6.0打开添加文件防崩溃插件:filetool.zip

vc6.0打开添加文件防崩溃插件:filetool.zip

2021-04-09

代码显示优化工具 C++ C#

代码显示优化工具 C++ C#

2021-03-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除