
C++
文章平均质量分 56
林多
座舱架构师
展开
-
【C++】关于指针Free和链表循环释放的问题
指针释放判断问题,与链表释放异常产生的崩溃。原创 2024-11-23 16:17:11 · 314 阅读 · 0 评论 -
【C++】std::set_new_handler使用场景
C++的STL提供了**std::set_new_handler**,new操作分配内存失败时,会先调用这个Handler。默认的new_handler行为是,抛出std::bad_alloc异常。原创 2024-03-31 14:38:38 · 1023 阅读 · 0 评论 -
【C++】智能指针shared_ptrs对于内存管理的陷阱
std::shared_ptr 是一种通过指针保持对象共享所有权的智能指针。内存管理是C++一个永远的话题,C++加入了std::shared_ptr帮助开发者更灵活的管理内存。但shared_ptrs对于内存管理,并非万能的。某些情况下的错误使用,会导致程序因为内存异常而崩溃。在gcc13上,支持给shared_ptrs设置为数组类型。因为std::shared_ptr销毁时,会自动释放指向的内容。那么如果用智能指针管理动态分配的数组,就会导致程序异常问题。原创 2024-03-24 20:18:20 · 582 阅读 · 0 评论 -
Linux文件锁flock
flock 多个进程同时操作同一文件时,容易导致文件中数据混乱。因此,需要锁操作保证数据的完整性。flock,建议性锁,不具备强制性。三种主要操作类型LOCK_SH 共享锁,多个进程可以使用同一把锁,常用作读共享锁。原创 2017-05-30 15:18:00 · 1376 阅读 · 0 评论 -
【C++】类型截断引起的Bug
类型截断引起的Bug背景最近遇到了一个Bug,由于崩溃堆栈定位到的是一个第三方的so中,查了许久。最终,定位到了出问题的部分。现象原因:Model层传给UI层,一个用于描画的Buffer。在使用前,该Buffer被异常释放。导致UI层再调用第三方库,创建纹理时崩溃。根本原因:C++类型截断导致类型截断下面的代码展示了类型截断的发生,以及导致Bug发生的现象// 父类clas...原创 2019-12-29 19:15:25 · 820 阅读 · 0 评论 -
OpenGl glScissor
OpenGl glScissorglScissor剪裁测试用于限制绘制区域。区域内的像素,将被绘制修改。区域外的像素,将不会被修改。// 开启剪裁测试glEnable(GL_SCISSOR_TEST);// 关闭剪裁测试glDisable(GL_SCISSOR_TEST);剪裁测试的区域,用(scissorX, scissorY, scissorW, sciss...原创 2018-09-11 14:09:02 · 5073 阅读 · 0 评论 -
【C++11】promise和future介绍
【C++11】promise和future介绍C++11提供了std::promise和std::future两个模板类,通过这两个模板类可以实现异步存储值并获取值的功能。std::promiseThe class template std::promise provides a facility to store a value or an exception that is later acquired asynchronously via a std::future object crea原创 2022-05-16 21:54:47 · 1275 阅读 · 1 评论 -
【C++】可变参数模板类的继承与偏特化展开
C++11可变参数模板可变参数模板是指参数不固定(0 ~ N个)的模板函数或模板类基本写法:template<class ... Args>class A {}// 或template<class ... Args>void fun(const Args&...args) {}概念的东西网上有很多。这里举一个,与实际项目中类似的例子可变模板参数类 + 继承 + 偏特化:#include <iostream>template<原创 2020-07-15 21:57:52 · 2307 阅读 · 0 评论 -
Linux c++获取进程/线程ID
Linux c++获取进程/线程ID有些时候,需要在Log中打出进程或线程的ID,以便调试、查找问题。获取进程ID#include &lt;unistd.h&gt;pid_t getpid(void);获取线程ID// 方法1#include &lt;sys/syscall.h&gt;syscall(__NR_gettid)// 方法2#include &lt;sy原创 2018-10-31 15:14:12 · 9441 阅读 · 0 评论 -
C++ 相同作用域的函数和变量不可同名
C++ 全局函数与全局变量不可同名C++中相同作用域的函数和变量不可同名// 编译报错int a = 10;void a(){ // some code}某日,在Chromium源码中看到如下代码。咋一看,以为函数与变量同名了,但是编译器没有错误。// xxx.cpp文件extern &amp;quot;C&amp;quot; {static AwDrawGLFunction DrawGLFunct...原创 2018-08-28 17:40:28 · 3737 阅读 · 0 评论 -
std::accumulate
std::accumulate头文件#include &amp;amp;amp;lt;numeric&amp;amp;amp;gt;作用累加求和,对于字符串可以将其连接起来(string类型的加,相当于字符串连接)例:累加求和std::vector&amp;amp;amp;lt;int&amp;amp;amp;gt; vec;vec.push_back(10);vec.push_back(20);原创 2018-10-31 15:27:19 · 20115 阅读 · 5 评论 -
C++创建文件夹和写文件
C++创建文件夹和写文件创建文件夹:一般来讲,需要先判断一下文件夹是否存在,如果不存在再创建。/* * 判断文件夹是否存在 */// 头文件#include&lt;sys/types.h&gt;#include&lt;dirent.h&gt;// 函数原型// 如果文件夹不存在,则返回空指针DIR* opendir (const char * path );/*...原创 2018-07-24 10:16:43 · 7972 阅读 · 2 评论 -
C++继承关于析构函数的问题
析构函数的问题关于C++中析构函数的作用,不在详述。在c++继承中,也知道要把父类的析构函数用virtual修饰关于析构函数的基本使用方法,也是很简单。但是!最近在工作中,遇到了一个关于析构函数很奇葩的问题!导致查了半天的Bug,才发现是少声明了一个析构函数。首先,存在Bug的代码,大体如下:// Base.h#define USE_EXPROT_ __attribut((...原创 2018-06-29 09:50:30 · 5132 阅读 · 2 评论 -
C++11右值引用简介
C++11右值引用最近做的某个项目,由于与国外的某些东西有关。接触到很多C++11、C++14的语法。一方面不时惊叹居然能这么写,另一方面觉得国外的技术确实比国内的发达,至少很多国内觉得新的技术,国外已经应用了许久了。所以,加油吧,努力吧。左值与右值左值:能用在等号左边,也能用在等号右边// 变量a是个左值int a = 1;// 函数返回值是个左值int x;i...原创 2018-06-27 16:06:53 · 872 阅读 · 0 评论 -
C++宏定义不受命名空间的约束
C++中,宏定义不受命名空间的约束例// xxx.hnamespace A{#define xxx() xxxxx}// 在其他文件中,引入xxx.h文件,使用宏定义时,不需要加命名空间// yyy.cpp#include "xxx.h"// somd codevoid func() { // 正确 xxx() }...原创 2018-06-20 22:04:58 · 7350 阅读 · 1 评论 -
C++ Vector容器销毁、拷贝与查找
std::vector释放内存std::vector::clear() Removes all elements from the vector (which are destroyed), leaving the container with a size of 0. 使用clear时,可能并未释放分配的内存空间代码std::vector&lt;int&gt...原创 2018-05-21 13:16:04 · 7606 阅读 · 0 评论 -
拷贝构造函数和赋值构造函数声明为私有
默认情况,编译器以“位拷贝”的方式自动生成缺省的构造函数和赋值函数。若类中有指针变量,那么缺省的构造函数会出现错误。拷贝构造函数在对象创建时被调用赋值构造函数只能被已存在的对象调用。String a(&amp;quot;hello&amp;quot;);String b(&amp;quot;world&amp;quot;);//拷贝构造函数String c = a;//赋值构造函数c= b;原创 2018-05-06 18:24:31 · 3557 阅读 · 0 评论 -
C++枚举类型初始值
枚举类型初值 若赋值,后面的缺省值一次增加若不赋值,则缺省值为0,1,2…// 赋值enum Weekly{ mon = 1, tue, // 2 wed, // 3 thu, // ... fir, sat, sun, // 7};// enum City{ beijing, // 0 ...原创 2018-05-06 18:17:51 · 13883 阅读 · 2 评论 -
Makefile ifneq和filter语句
Makefile语句某项目中mk文件中,用到了ifneq和filter。发现它们俩搭配时,蛮有用的。ifneq语句ifneq : 判断语句,用于比较两个参数,如果两个参数不等,则该语句通过# 如果a和b不相等,则do somethingifneq ($(a), $(b)) # do somethingendiffilter语句filter:...原创 2018-05-11 18:03:09 · 22943 阅读 · 0 评论 -
关于宏函数的返回值
宏函数与普通函数// 宏函数#define Min(x, y) \ ((x)<(y)?(x):(y)) // 普通函数int Min(int x, int y){ return x < y ? x : y;}普通函数,在定义时需要指明返回类型及返回值宏函数,在定义时不需要指明返回类型及返回值。那么宏函数的返回值是什么?**答:宏函数中最后一...原创 2018-05-09 17:04:18 · 19181 阅读 · 3 评论 -
C++perror函数
perror作用:将上一个函数发生的错误原因,输出到标准设备.C++中的errno变量,是用来记录错误类型。当调用,某些函数出错时,会自动设置errno的值。此时,可以利用perror,将errno错误输出。代码// 头文件#include &lt;stdio.h&gt;/* 函数原型 * 参数str,指定要输出的字符串 * 如 perror("Error:") * 输...原创 2018-05-01 16:24:25 · 5130 阅读 · 0 评论 -
C++STL算术类函数对象
STL算术类函数对象什么是函数对象? 函数对象可以简单理解为: 1. 重载函数操作符“()”的类,这种类的对象,称为函数对象。 2. 它是行为类似函数的对象,又称仿函数。算术类函数对象的种类// 加std::plus&lt;T&gt;;// 减std::minux&lt;T&gt;;// 乘std::multiplies&lt;T&gt;;// 除原创 2018-04-01 16:24:13 · 569 阅读 · 0 评论 -
Tensorflow C++ png图片读取
Tensorflow C++ 内部提供PNG图片解码的操作,其定义的头文件为#include "tensorflow/core/lib/png/png_io.h"// 解码函数// CommonInitDecode// CommonFinishDecode读取PNG并解码 // 读取原始PNG数据 std::string pngString; std...原创 2018-03-23 11:26:16 · 2031 阅读 · 0 评论 -
Json Editor命令行版
Json EditorJson是一种轻量级的数据交换格式,用于表示和存储数据。Json语法简单,便于与程序交互。Json可简单理解为:易于“代码”阅读的文字。RapidJson是一款处理Json的开源库,官网对它的解释如下: RapidJSON is a JSON parser and generator for C++. It was inspired by RapidXml...原创 2018-10-04 17:41:38 · 410 阅读 · 0 评论 -
const iterator与const_iterator的区别
const iterator与const_iterator的区别const iterator相当于指针常量。即,指针本身为常量,指针自身不可修改,但指向内容可修改。const_iterator相当于常量指针。即,指针指向的内容为常量,指针本身可修改,但指向内容不可修改。两者的区别还是挺大的,使用时需要注意。例:#include &lt;iostream&gt;#include &l...原创 2018-12-16 16:10:31 · 1127 阅读 · 1 评论 -
std sort崩溃Crash问题解决
std sort崩溃Crash问题解决某天关于std::sort遇到了一个很奇怪的问题,描述如下。问题描述:对一个vector,每次添加一个数据时,就进行std::sort排序。当进行到第16次时,必定会出现Crash。Thread "xxxx" received signal SIGSEGV, Segmentation fault问题代码:// 比较函数typedef st...原创 2019-01-11 13:46:05 · 3007 阅读 · 0 评论 -
C++反向迭代器
C++反向迭代器常规迭代器:iterator,通过“++”操作,从前往后遍历(begin 到 end -1)。反向迭代器:reverse_iterator,通过“++”操作,从后往前遍历(end -1 到 begin)。例子:#include &lt;iostream&gt;#include &lt;vector&gt;int main(){ std::vector&l...原创 2019-02-23 14:37:20 · 1218 阅读 · 0 评论 -
【C++】atomic简介
C++ atomic简介C++11起提供了atomic,可以使用它定义一个原子类型。原型:template< class T >struct atomic;成员函数:atomic提供了一些与原子操作有关的成员函数。成员函数说明store原子地以非原子对象替换原子对象的值load原子地获得原子对象的值详见:https://zh....原创 2019-09-12 11:58:00 · 27442 阅读 · 0 评论 -
【C++】String赋值错误引发的一个Bug
String赋值错误引发的一个Bug某日在实现一个新功能时,在代码中很不起眼的一行,调用一个接口时将其一个为string类型的形参,赋值为0。编译通过,然后程序每次调用新功能时必Crash。之后,通过追加Log,反复查找。最终定位到传错参数类型的接口调用处。// 错误示例// some Codeif (NULL != obj) { // id message callbacki...原创 2019-09-05 18:25:49 · 7572 阅读 · 0 评论 -
【C++】函数模板设置默认参数小例
函数模板设置默认参数小例C++11开始,支持给函数模板设置默认参数。例:#include <iostream>#include <string>// 设置_T2默认类型为string,默认值为linduotemplate<typename _T1, typename _T2 = std::string> void output(_T1 str...原创 2019-09-04 16:11:13 · 786 阅读 · 0 评论 -
【UT】UnitTest Fake
UnitTest Fake什么是FackFake Function Framework ,是一种实体的模拟。Fake是一种虚假的实现,可以自定义返回的结果。简单理解的话,Fake用于C函数。用来模拟函数的返回值。个人理解,Mock用于C++(对象),Fack用于C(函数)例子相关头文件,在fake库中提供,自行搜索下载吧。myFake.h#ifndef MYFACK_H...原创 2019-08-30 18:03:08 · 752 阅读 · 0 评论 -
C++隐藏与覆盖
C++隐藏与覆盖问题与原因最近在做某个项目的单元测试,遇到了一个问题:Mock掉一个类之后,代码执行时没有走Mock后的函数。// 要测试的类Class XXX{ //... private: // 原有的成员变量 Test* m_test;}// Mock掉Test类Class TestMock : public Test{ public: // ...原创 2019-07-26 15:01:30 · 828 阅读 · 0 评论 -
libcurl多线程OpenSSL加锁
libcurl多线程OpenSSL加锁libcurl多线程运行一段时间,会崩溃。原因:opensll不支持多线程,要手动加锁处理。实现:注册两个回调函数openssl锁l函数原形 :void (* func )(int ,int , const char * ,int)设置方式:CRYPTO_set_locking_callback(void (* func )(int ,i...原创 2019-06-30 16:53:15 · 1344 阅读 · 0 评论 -
Traits技术
Traits技术traits=特性提取不同类的共性,统一处理依靠显示模板特殊化,把代码中因不同类型发生变化的片段提取出,用统一的接口来包装接口可以为c++类所能包含的任何东西客户通过traits模板类公开的接口来间接访问代码示例#include <iostream>using namespace std;class CIntArray{...原创 2019-06-30 16:50:25 · 1819 阅读 · 0 评论 -
【STL】std::next
std::next函数原型// 第一种template < class ForwardIt>ForwardIt next(ForwardIt it, typename std::iterator_traits<ForwardIt>::difference_type = 1);// 第二种template<class InputId>const...原创 2019-06-30 16:38:14 · 4083 阅读 · 1 评论 -
共享内存 Shared Memory
共享内存 Shared Memory共享内存允许两个不相关的进程,访问同一个逻辑内存。共享内存,没有提供同步机制。需要使用其他机制(互斥锁,信号量),对共享内存进行同步操作。原理每个进程通过PCB标识,并拥有属于自身的地址空间(Address Space)。与之相应的,存在一个页表,将进程的虚拟地址与物理地址进行映射,并通过内存管理单元(MMU)进行管理。多个不同的虚拟地址,通过页...原创 2019-06-30 16:13:52 · 1615 阅读 · 0 评论 -
C++ 错误 pure virtual method called
C++ 错误 pure virtual method called某日做UnitTest(单元测试)时,Gtest跑完析构时,报出如下错误...............[ PASSED ] X tests.pure virtual method calledterminate called without an active exceptionSegmentation faul...原创 2019-07-08 10:56:23 · 13386 阅读 · 0 评论 -
MakeFile直接展开式与递归展开式
MakeFile直接展开式与递归展开式最近看MakeFile时,看到了这两个概念,总结一下。直接展开式定义xxx := xxx当make读到该行时,立刻展开该表达式(有点类似C++中的定义)。TEST := $(TEST1)TEST1 := helloall: @echo $(TEST) @echo $(TEST1) @echo Done输出:对于"TE...原创 2019-04-19 17:16:02 · 1119 阅读 · 0 评论 -
c++读写锁实现
c++读写锁实现C++17,提供了shared_mutex。配合C++14,提供的shared_lock。及C++11,提供的 unique_lock, 可以方便实现读写锁。但上述的前提是,允许你使用C++17。在国内的开发环境下,别说C++17,连C++11用的也不多。所以,大多数时候,我们需要自己实现一套C++读写锁(C++11环境下)。代码实现RWLock.h#ifnd...原创 2019-03-26 10:37:37 · 10186 阅读 · 3 评论 -
C++ always_inline
always_inlineatrribute((always_inline))强制内联。所有加了该语句的函数,在编译时会作为内联函数被使用(不会被编译成函数调用方式,而是直接嵌入到调用函数体内)。会加快函数调用的速度,但会增加函数体的大小(相当于把代码直接copy过去)。慎用。__attribute((always_inline) void a(){ // ... }...原创 2019-03-10 19:20:52 · 3379 阅读 · 0 评论