
cpp-疑难杂症研究
ByteFlys
这个作者很懒,什么都没留下…
展开
-
【C++】将非数值类型按数值打印
要将非数字类型,按照其对应的二进制数值打印,只需要在该变量前面加上一个+号即可。原创 2022-12-15 11:12:56 · 402 阅读 · 0 评论 -
【C++】Dll的Release版本和Debug版本不能混用
std::string和std::vector,在release和debug下的实现方式是不同的,内存使用情况也不一致。在Release模式下,程序可以正常运行,在Debug模式下,程序报内存错误,可能会出现以下两种错误。如果debug版本的exe,使用了release版本的dll,则有可能导致内存错误。因此,如果dll使用了std库,则必须保证dll和exe是使用相同规则编译出来的。C语言确实有很多比较麻烦的地方,大家只能靠经验去解决。原创 2022-11-27 10:34:40 · 2042 阅读 · 0 评论 -
【C++】指针什么时候必须delete,什么时候可以不delete
栈中的变量,是由程序自动进行管理的,当变量作用域结束后,程序就会自动释放,因此其内存区域不需要手动delete。所以,栈和堆的设计,是为了保证程序调度能高效的进行,像函数调用这种,在程序中是无时不刻都在进行的,必须保证效率。除了存放大型数据,堆的另一个作用,是可以数据共享,多个函数中的指针,可以访问同一份数据。堆和指针的设计,就是为了把栈中不必要的数据,单独放到一个垃圾堆中去,从而保证栈的高效。像数组,大的内存区域,复杂对象,我们则会通过new或malloc的方式,存到堆内存中。原创 2022-11-20 17:49:29 · 4750 阅读 · 0 评论 -
【线程同步】条件变量condition为什么必须配合互斥体mutex使用
判断a条件符合,则发出一个condition-a成立的信号,如果b条件符合,则发出一个condition-b成立的信号。至于问题二,如果等待condition时不释放mutex的话,那么其它线程永远无法改变资源的状态,条件永远也不可能成立。那么,答案就很清楚了,因为状态是属于某个具体资源的,如果没有mutex的保证,状态判断可能也是错误的。首先,互斥体mutex大家应该都很容易理解,就是给资源上锁,防止并发操作,导致程序异常。线程同步属于操作系统方面的知识,它不属于某个具体的语言,也不属于某个具体的库。原创 2022-10-31 14:59:45 · 705 阅读 · 0 评论 -
【C++】【字符串格式化】printf用法详解
输出内容控制宽度和对齐指定数据类型。原创 2022-10-29 18:10:43 · 5176 阅读 · 0 评论 -
【C++】【字符处理】C++替换字符中的某个字符,最简单的实现方式
str.erase(remove_if(str.begin(), str.end(), [](char c) -> bool { return c == '1';}), str.end());原创 2021-09-12 23:22:35 · 1803 阅读 · 0 评论 -
【C++】【异常处理】为什么c++代码里,使用了try-catch后,还是会崩溃
C++的try-catch,和Java、Javascript的异常处理,性质是不一样的C++的try-catch,只能捕获在代码中主动throw出去的错误对于空指针,野指针,内存越界等不在预料之中的错误,是没办法捕获的所以C++的异常机制,更多时候是为了方便处理可预见的异常,对于程序崩溃是没太大效果的这就是为什么很多人不建议在C++中使用try-catch的原因,它有点用有用,但好像又没太大用,地位比较尴尬但是C语言是底层语言,很多时候都是直接和内存打交道出了致命问题,就算程序不崩溃,再继续运行原创 2021-07-19 21:07:25 · 5980 阅读 · 1 评论 -
【C++】【pthread】C++ POSIX Thread 线程同步常用API讲解
线程pthread_create 创建线程四个参数分别为pid,attr,function,args其中function是一个函数指针,这个函数接收一个void*,也返回一个void*第四个参数args,就是传给function函数的参数context static pthread_t pidDecode = 0; pthread_create(&pidPlay, nullptr, [](void *context) -> void * { AudioChanne原创 2021-07-16 17:59:58 · 1751 阅读 · 1 评论 -
【C++】【pthread】pthread_mutex_lock called on a destroyed mutex
一般是调用了析构函数进行destroy后,其它的线程还在调用使用了mutex的方法具体原因取决于代码是如何编写的,但大致可以从以下方面出发来考虑原创 2021-07-12 09:45:28 · 13816 阅读 · 0 评论 -
【C++】【内存结构】栈和堆的区别
什么是栈和堆我们这里说的栈和堆,是指内存空间中的两块不同区域,不是指数据结构中的Heap、Stack之所以他们都叫栈和堆,是因为这两个词本来就是生活中描述外形的词语只要外形差不多,都可以这么叫,一个是数据结构的外形,一个是内存结构的外形,如此而已内存中的栈和堆有什么区别栈是程序启动时,操作系统为进程预分配的固定内存空间堆是程序运行时,向操作系统申请,动态分配的内存空间寄存器对栈可以直接寻址,而堆则需要间接寻址堆的空间较小,是队列结构,分配和查找速度更快堆的空间很大,是二叉树结构,分配和查找原创 2021-07-02 09:53:15 · 390 阅读 · 0 评论 -
【C++】多个cpp文件,使用同名的共享变量,或使用同名的独立变量
多个cpp文件共享h文件中的同名变量 // a.h // extern表示声明一个变量,但并没有实际创建这个变量,这个变量会在其它地方创建 // 如果不加extern,则表示直接创建变量,那么多个cpp文件就会重复创建同名变量,报错 extern int p; // b.cpp #include"a.h" // 创建变量 // 至少且只能在一个cpp文件中创建变量 // 如果没有创建变量,在编译时会提示变量未定义 // 如果在多处创建变量,在编译时会提示变量重复定义 int p原创 2021-06-19 15:38:58 · 5507 阅读 · 0 评论 -
【C++】【复合类型】如何理解OpenSL中的SLObjectItf的类型定义
源码 typedef const struct SLObjectItf_ *const *SLObjectItf;解析首先,我们把修饰词去掉,简短来看就是 typedef CLAZZ **ALIAS;这个很简单,ALIAS是一个别名,它实际类型是指向指针的指针,即CLAZZ**我们再继续来看修饰词的含义在C++中,【*const】表示指针是常量,声明后不能再指向其它地址,【const*】表示指针指向的是一个常量变量结构体类型,在使用时,类型前要加上【struct】那么源码中的语原创 2021-06-11 09:56:44 · 355 阅读 · 2 评论 -
【C++】【指针和引用】*&作为参数和语句时的作用
含义 作为参数时,【*&】表示参数的真实类型是引用,只是它引用的是一个指针类型的数据 作为语句时,表示先对变量进行取址,再对变量进行取值作为参数时 void releaseAvFrame(AVFrame *&frame){ frame = nullptr; } AVFrame *p = new AVFrame(); releaseAvFrame(p); //由于frame是p的引用,当frame置空时,p也被置空 //一般需要在函数内部,修改外部实参poi原创 2021-06-03 08:56:56 · 420 阅读 · 0 评论 -
【C++】【函数指针】void (*p)(),void *p(),void p()的区别
代码 void voidFunc1(int); void *voidFunc2(int); void execVoidFunc1(void (*voidFunc)(int)) { voidFunc(0); } void execVoidFunc2(void *voidFunc(int)) { voidFunc(0); } void execVoidFunc3(void voidFunc(int)) { voidFunc(0); }..原创 2021-06-01 15:27:38 · 739 阅读 · 0 评论 -
【C++】【编译器】C语言编译器的那些事
GNU和LinuxGCC和G++make与makefilecmake与CMakeListsMinGWCygwin和MSVCMinGW和Cygwin是如何将GCC移植到Windows上的原创 2020-02-09 03:55:05 · 428 阅读 · 0 评论 -
【零基础学QT】【037】C++中char,wchar,string,wstring
char和wchar_t char是C++基本类型,占一个字节(8位),可用来存储单个字符的Unicode码,由于正好8位,也可用来存储字节 wchar_t是C++扩展类型,占两个字节,可以用来存储Unicode/UTF16双字节字符。它实质上是unsigned short的一个别名,由于unsigned short占两个字节(16位),正好可以用来模拟双字节字符类型。 typedef...原创 2019-12-13 10:25:43 · 1034 阅读 · 0 评论 -
【C++】【字符编码】常见字符编码的区别:ASCII,Unicode,UTF8,GBK,GB2312,Latin1,ISO8859,ANSI
从ASCII到Unicode的发展故事 ASCII是最早的编码方式,由于计算机起源于美国,ASCII只支持英文和数字,以及一些用于程序的控制符 等到计算机传播到其它国家时,由于ASCII无法表示其它国家的字符,各国便纷纷推出了自己的字符集。比如中国就推出了包含了汉子字符的GB2312字符集。这些编码的靠前部分,一般都和ASCII是一致的,但后面的部分,不同编码却是不一样的 每个国家都使用自...原创 2019-12-09 16:31:25 · 747 阅读 · 0 评论 -
【零基础学QT】【023】C++中的Lambda表达式
什么是Lambda表达式Lambda表达式语法规则Lambda表达式使用示例原创 2019-10-06 20:00:24 · 251 阅读 · 0 评论