
C++
文章平均质量分 82
luofengmacheng
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【Linux】使用AddressSanitizer分析内存非法使用问题
AddressSanitizer是进行内存异常使用分析的工具,该工具已经集成到编译器中,因此,只能用于分析C/C++语言的内存问题分析。与Valgrind相比,运行速度更快,但是,从场景来说,AddressSanitizer主要用于检测内存的非法使用,当然也包括内存未正确释放的问题,而Valgrind则可以分析出导致内存增长的调用栈。如果出现内存偏高的问题,可以使用Valgrind工具分析如果出现内存导致的core问题,可以使用gdb的watchpoint或者AddressSanitizer分析。原创 2024-05-23 17:48:37 · 2221 阅读 · 0 评论 -
【Linux】使用Valgrind定位内存增长问题
Valgrind是Linux上的一套开源的动态分析工具集,通常用来检测和分析程序中的错误,提高程序的稳定性和性能。Valgrind整体架构上包含内核和周边工具集,将程序放到内核模拟的仿真环境中运行,并提供一些能力接口,然后基于这些接口实现周边工具。当程序运行过程中,内存持续增长,一段时间后就可能造成OOM,此时可以使用Valgrind的Massif工具分析程序执行过程中的堆分配内存量。原创 2024-05-11 16:01:07 · 1923 阅读 · 0 评论 -
【Linux】如何定位客户端程序的问题
不管什么语言开发的程序,都会遇到两类比较棘手的问题:崩溃和性能问题,其中性能问题又可以分为CPU占用高和内存占用高。C/C++需要获取core文件,根据堆栈分析出现问题的代码行,开发环境可以配置core路径,正式环境可以使用Breadpadgolang中可以将GOTRACEBACK设置为crash让程序崩溃时生成core文件(但是,发现用gdb打开时没有程序的符号名,并且core文件很大),也可以在程序退出时利用中的Stack()获取堆栈。原创 2024-05-09 15:08:31 · 788 阅读 · 0 评论 -
C++多线程编程(四): atomic原子操作
原子操作的意思是该操作执行过程中不能被中断,该操作要么不执行,要么全部执行,不存在执行一部分的情况。在编程语言中,有些操作虽然看起来只有一行,但是变成机器语言后就是多个操作步骤,其中的每个操作步骤都是一个原子操作,但是这些操作合起来却不是原子操作,这样的代码在并发执行时可能会调度到其他线程,从而出现中断的情况,造成数据不一致。原子操作是不能被分割和中断的操作,在多线程并发环境中修改共享数据时,由于数据更新操作不是原子的,会造成数据不一致。原创 2024-01-21 20:28:05 · 3488 阅读 · 1 评论 -
C++多线程编程(三): std::thread线程类
在C++11以前,如果要使用多线程,就需要使用各平台的多线程库,例如,Linux上可以使用pthread,windows上可以使用win32或者MFC提供的多线程API,也就是说,如果要使用多线程,就必须与平台绑定,那么程序就不具备跨平台的能力,为了让程序更好的运行在各平台而不需要用大量的宏来控制编译选项,C++11提供了对多线程的支持,提供了std::thread类。原创 2024-01-19 18:46:55 · 792 阅读 · 0 评论 -
C++多线程编程(二):条件变量
互斥锁是为了保证多个线程在访问共享资源时不会出现不可预期的结果,能够让多个线程不会同时执行lock和unlock之间的代码,也就是说,互斥锁只是保证在访问共享资源时不会出现问题,但是,有一种场景是需要线程之间进行协作,典型的是生产者-消费者模型:生成者生成数据,放到队列后,通知消费者,消费者接收到信号后,从队列中取出数据进行处理。互斥量是用于解决多个线程同时访问某个资源的并发问题,条件变量是解决多个线程之间进行同步的问题。原创 2024-01-17 18:58:12 · 1126 阅读 · 0 评论 -
C++多线程编程(一):互斥锁
在现代程序开发中,会大量使用多线程机制,很多语言都内置了对多线程的支持,而C++直到C++11才提供了对多线程的支持,既然支持多线程,那么一定也提供了锁的支持。为什么多线程就一定用锁呢?因为当程序以多线程运行时,如果有对共享资源的使用,例如,两个线程同时对共享变量进行修改,由于这些操作不是原子操作,就会导致出现异常情况,修改的两个线程都认为操作成功了,但是实际上只有一个成功了。这时就需要锁去保证两个操作都分别执行完成。因此,使用锁就需要搞清楚要保护的共享资源。原创 2024-01-15 18:56:14 · 2326 阅读 · 0 评论 -
c++的lambda表达式
首先使用thread创建一个线程,线程的构造函数接受两个参数,一个是函数,另一个是参数列表,这里用lambda表达式提供函数,lambda表达式有一个整型参数,然后将参数列表设置为10,作为lambda表达式的参数,最后调用thread的join等待线程执行结束。首先定义print类型的函数指针,然后定义了func函数,它接受print类型的参数,然后调用它,而在主函数中,定义了接受相同形参的lambda表达式,然后传给func函数。参数列表:函数的参数,支持使用值传递和引用传递,如果没有参数,可以省略。原创 2023-10-07 23:23:36 · 347 阅读 · 0 评论 -
教你三步搞定VsCode调试C++
使用VsCode进行C++开发时,除了在机器上安装必要的编译工具(例如,gcc、g++、cmake等)之外,还需要在VsCode配置编译任务,从而可以通过点击或者快捷键的方式进行快速编译。tasks中有三个对象,第一个是执行cmake命令,第二个是make命令,第三个是将第一个和第二个整合起来,顺序调用cmake和make,并且设置为默认操作,因此,当选择。时,就会依次执行cmake和make进行编译。原创 2023-10-07 09:04:34 · 7031 阅读 · 5 评论 -
C++中的static和extern关键字
声明就是告诉编译器有这个东西的存在,而定义则是这个东西的实现。// 变量声明,声明时不能赋值,如果进行赋值,就是定义// 变量定义,定义时可以为其赋值,并且此时赋值是个好的习惯对于函数来说,声明就是告诉编译器存在这个名称的函数,定义则是这个函数的实现。// 函数声明// 函数定义声明和定义的区分主要用于全局变量,毕竟,局部变量不需要区分声明和定义。需要记住的是:全局范围内,变量的声明可以有多个,而定义只能有一个。原创 2023-10-06 22:19:21 · 495 阅读 · 0 评论 -
专栏文章列表
C++和Linux相关内容原创 2023-10-06 22:17:33 · 560 阅读 · 0 评论 -
lua如何调用C/C++
查看一个lua模块的源代码会发现,lua模块的实现中既包含lua代码,也包含C代码,其中,C代码的主要逻辑就是获取参数,调用系统调用,返回值,C代码会编译为so供lua调用,而lua代码就是将C代码提供的一些接口进行再封装,以便在lua中更好用,更简单,然后再通过lua代码对外提供接口。跟其他脚本语言类似,lua中也是通过变量来控制模块的查找的,其中package.path是搜索lua模块的路径,package.cpath是搜索so模块的路径,先查找lua模块,再查找so模块。原创 2023-10-06 22:11:33 · 1222 阅读 · 0 评论 -
[C++] 异常处理
C++中的异常处理原创 2014-04-22 10:32:19 · 1165 阅读 · 0 评论 -
[C++] smart pointer
C++中的智能指针原创 2014-05-15 16:02:27 · 1531 阅读 · 0 评论 -
[LeetCode] Set Matrix Zeroes
给定一个m * n的矩阵,如果某个元素为0,就把将该元素所在的行和列都置为0,要求原地操作。原创 2014-04-09 10:42:15 · 1186 阅读 · 0 评论 -
[C++ Primer] 第七章的若干问题
1 将const引用作为形参(P203)如果函数的形参是非const的引用,就不能通过const对象进行调用,而且传递一个右值或者需要进行类型转换的对象同样是不允许的,因为非const引用的形参只能与完全同类型的非const对象关联。忠告:当确定函数不改变引用形参的值时,应该将引用形参定义为const引用。2 容器作为形参当将容器作为形参时,要进行容器之间的拷贝,代价较大。原创 2013-11-07 10:29:45 · 912 阅读 · 0 评论 -
[C++ Primer] 第十五章的句柄类
为什么要使用句柄呢?句柄可以用来管理指针,以句柄代表的语义可以将句柄分为:指针型句柄和值型句柄。原创 2013-12-09 20:54:38 · 1224 阅读 · 0 评论 -
[C++ Primer] C++中sort对类对象进行排序
使用sort对类对象进行排序:使用自定义的比较函数;重载operator<操作符;使用自定义的函数对象;对<functional>中的类模板进行派生创建函数对象;原创 2013-12-11 15:44:01 · 17768 阅读 · 0 评论 -
[STL源码剖析] 自增和自减运算符的重载
在运算符重载中,自增和自减运算符的重载因为其操作数的问题而呈现出与其它运算符重载不一样的特性。原创 2014-01-07 15:16:00 · 1711 阅读 · 0 评论 -
[STL源码剖析] list中的sort()函数
list不能使用STL提供的算法sort(),必须用list自己的成员函数sort()原创 2014-01-09 15:23:55 · 1514 阅读 · 0 评论 -
[C++] 将成员函数作为函数形参
函数以及函数对象都可以作为参数来增加其它函数的功能,并且通常作为STL算法的第二个版本的最后一个参数。成员函数是否可以作为形参呢?如果可以,形参表如何写呢?原创 2014-02-21 11:29:09 · 10488 阅读 · 0 评论 -
[深度探索C++对象模型] 默认构造函数和拷贝构造函数的构造操作
(1)何时编译器会合成一个默认构造函数?(2)默认构造函数做什么?(3)何时会调用拷贝构造函数?(4)什么情况下会合成拷贝构造函数呢?原创 2014-03-03 22:34:17 · 1338 阅读 · 0 评论 -
[C++] NRV优化
对于函数返回对象时,编译器的NVR优化。原创 2014-03-12 09:40:52 · 3067 阅读 · 1 评论 -
[C++] [算法] [Linux] radix tree
radix tree的基本概念和实现原创 2014-03-12 21:26:17 · 4136 阅读 · 1 评论 -
[LeetCode] Longest Consecutive Sequence
给定一个未排序的整数数组,找到其中最长的连续序列的长度。要求算法的复杂度是O(n)。原创 2014-04-08 09:46:12 · 1028 阅读 · 0 评论 -
[C++ Primer] 第四章的若干问题
1 指针和typedeftypedef string *pstring;string str("abc");const pstring cstr = &str;上面将pstring定义为string *,然后在定义cstr时在前面添加const,很容易让人以为cstr的类型是const string *,其实它的类型应该是string *const,也就是说它是个const指针,指原创 2013-10-31 16:05:18 · 1009 阅读 · 0 评论