语言: C++
文章平均质量分 50
北雨南萍
长期专注于实时音视频通信技术、音视频处理技术,包括基于webrtc的音视频通信解决方案,基于ffmpeg的媒体处理解决方案。
展开
-
terminate called after throwing an instance of ‘std::regex_error‘解决办法
terminate called after throwing an instance of 'std::regex_error'解决办法原创 2023-11-27 14:27:37 · 965 阅读 · 0 评论 -
Makefile通用模板
###EXECUTABLE:=11-8LIBDIR:=LIBS :=INCLUDES :=SRCDIR :=##CC := g++CFLAGS := -g -Wall -O3CPPFLAGS := $(CFLAGS)CPPFLAGS += $(addprefix -I, $(INCLUDES))CPPFLAGS += -MMD##RM-F := rm -f# # You shouldn't need to change anything below this poin原创 2021-11-15 11:56:20 · 875 阅读 · 0 评论 -
linux下 GDB 调试动态链接库
> gdb <你的可执行程序>(gdb) b main # 设置入口断点(gdb) r [可执行程序的命令行参数] # 启动调试(gdb) load <要调试的动态库, 如 test.so> # 将动态库加载入内存(gdb) dir <要调试的动态库的源码路径, 如 ./src>(gdb) sharedlibrary <要调试的动态库> # 将动态库的符号读入gdb,为了你能找到变量和函数名(gdb)...原创 2020-08-04 10:25:23 · 6953 阅读 · 0 评论 -
gtest应用指南
前言gtest是Google的开源C++单元测试框架,是遵循 New BSD License (可用作商业用途)的开源项目。google内部的大多数C++代码都已经使用这个测试框架进行单测,知名的使用gtest进行测试的项目有chromium , webrtc, quic等。gtest 可以支持绝大多数大家所熟知的平台。Gtest的使用较为方便,它可以自动记录下所有定义好...原创 2020-04-13 12:59:24 · 869 阅读 · 0 评论 -
Linunx的sleep,usleep,select,nonasleep对比与应用
函数名: sleep头文件: #include // 在VC中使用带上头文件 #include // 在gcc编译器中,使用的头文件因gcc版本的不同而不同功 能: 执行挂起指定的秒数语 法: unsigned sleep(unsigned seconds);示例:#include #includeint main(){ i原创 2013-03-08 17:18:00 · 140454 阅读 · 3 评论 -
boost学习与应用笔记之一:Boost.Atomic
Presenting Boost.AtomicBoost.Atomic is a library that provides atomic data types and operations on these data types, as well as memory ordering constraints required for coordinating multiple thr原创 2016-04-10 10:13:24 · 3062 阅读 · 0 评论 -
Boost.Lockfree官方文档翻译
Boost_1_53_0终于迎来了久违的Boost.Lockfree模块,本着学习的心态,将其翻译如下。(原文地址:http://www.boost.org/doc/libs/1_53_0/doc/html/lockfree.html) Chapter 17. Boost.Lockfree第17章.Boost.LockfreeTable of Contents目录Intro转载 2016-04-09 22:48:56 · 691 阅读 · 0 评论 -
linux下安装boost与测试
Boost库是一个功能强大,构造精巧,跨平台,开源并且完全免费的C++程序库,它作为标准库的后备,是C++标准化进程的发动机之一,在linux安装过程如下:去官方网站下载最新的:www.boost.org一,下载,编译安装,需要到官方网站下载最新的版本,最新已经到1.60.0。$ tar -jxvf boost_1_60_0.tar.bz2 $ cd boost原创 2016-04-09 08:33:02 · 7962 阅读 · 0 评论 -
openSSL在Win7下的编译与安装
一. 下载与安装1. 下载openssl:http://www.openssl.org/source/ 下载最新版本的openssl-1.0.1c.tar.gz 。解压到C:\openssl-1.0.1c,在openssl-1.0.1c的目录下面,会看到有两个文件INSTALL.W32 和INSTALL.W64;他们分别是在32位和64位下的安装文档,2. 下载并安装原创 2016-04-25 15:18:16 · 8325 阅读 · 0 评论 -
C++11中的std::bind 之二
这几天学习Cocos2d-x,看到了以下的一段代码:// new callbacks based on C++11#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)#define CC_CALLBACK_1(__selector_转载 2015-12-22 17:33:04 · 1834 阅读 · 0 评论 -
C++11中的std::bind
最近在看看cocos2dx的源代码,发现了cocos2dx 3.0相对于2.0改动了很多,最大的改变就是大量的使用了C++11的特性,比如auto等。其中有一个关于回调函数绑定的宏定义就使用了std::bind特性// new callbacks based on C++11#define CC_CALLBACK_0(__selector__,__target__, ...转载 2015-12-22 17:17:57 · 745 阅读 · 0 评论 -
boost::filesystem指南
开始写作boost库指南系列文章了,我个人比较熟的就是这个filesystem库,当然要从这里先开始。这系列指南只是对初学的一个快速指南,没有深入学习,当然我个人水平也不敢说“深入”二字。C++程序一直有一个方面不能做可移植性,尽管标准库有几个函数用于操作与文件系统相关的任务,但是这几个函数作用相对我们日常对文件系统操作的需求来说真是杯水车薪,所以对目录、路径、文件元信转载 2015-12-17 11:49:15 · 777 阅读 · 0 评论 -
C++11新特性,利用std::chrono精简传统获取系统时间的方法
一、传统的获取系统时间的方法传统的C++获取时间的方法需要分平台来定义。相信百度代码也不少。我自己写了下,如下。const std::string getCurrentSystemTime(){ if (PLATFORM_ANDROID || PLATFORM_IOS) { struct timeval s_now; struct tm*转载 2015-12-17 17:00:19 · 992 阅读 · 0 评论 -
boost之program_options库,解析命令行参数、读取配置文件
原文链接:http://www.cnblogs.com/lidabo/p/3906053.html一、命令行解析tprogram_options解析命令行参数示例代码: #include using namespace std; #include namespace po = boost::program_optio转载 2016-05-12 21:33:35 · 1406 阅读 · 0 评论 -
C++序列化方案
1. 什么是序列化?程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这个将程序数据转化成能被存储并传输的格式的过程被称为“序列化”(Serialization),而它的逆过程则可被称为“反序列化” (Deserialization)。简单来说,序列化就是将对象实例的状态转换为可保持或传输的格转载 2016-05-18 18:09:48 · 2186 阅读 · 0 评论 -
linux C++下多实例间的线程安全锁
一、在多实例间实现全局的线程安全锁1.1 实例场景:1. 类的声明与定义//channel.hclass CChannel{ friend void* audio_write_process(void* params); friend void* video_write_process(void* params);public: CChannel();原创 2017-12-29 11:32:45 · 526 阅读 · 0 评论 -
面向对象设计原则实践:之五.迪米特原则,接口隔离原则
六、迪米特(第三者交互)原则1. 定义每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。 2. 分析1) 迪米特法则就是指一个软件实体应当尽可能少的与其他实体发生相互作用。这样,当一个模块修改时,就会尽量少的影响其他的模块,扩展会相对容易,这是对软件实体之间通信的限制,它要求限制软件实体之间通信的宽度和深度。2) 狭义的迪米特法则...原创 2018-08-27 09:39:53 · 799 阅读 · 0 评论 -
面向对象设计原则实践:之四.里氏代换原则
五、里氏代换原则(LSP--Liskov Substitution Principle)1. 定义a). 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型S是类型T的子类型。b). 子类型必须能够替换它的基类型。LSP又称里氏替换原则。 对于这个原则,通俗一些的理解就是,父类...原创 2018-08-27 09:33:40 · 851 阅读 · 0 评论 -
面向对象设计原则实践:之三.单一职责原则,合成复用原则
三、单一职责原则(SRP--Single-Responsibility Principle )1. 定义a). 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。b). 就一个类而言,应该仅有一个引起它变化的原因。 所谓职责,我们可以理解他为功能,就是设计的这个类功能应该只有一个,而不是两个或更多。也可以理解为引用变化的原因,当你发现有两个变化的因素...原创 2018-08-27 09:28:57 · 1809 阅读 · 1 评论 -
面向对象设计原则实践.之二.依赖倒转原则
二、依赖倒转原则(DIP--Dependency Inversion Principle)1.依赖倒转原则定义a). 高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。b). 要针对接口类/抽象类编程,不要针对实现编程。 高层模块包含了一个应该程序中的重要的策略选择和业务模型,正是这些高层模块才使得其所有的应用程序区别于其他,...原创 2018-08-27 09:23:40 · 472 阅读 · 0 评论 -
面向对象设计原则实践:之一.开放封闭原则
常用的面向对象设计原则包括7个,这些原则并不是孤立存在的,它们相互依赖,相互补充。 名称 易记符 设计原则及简介 实现关键 关系 重要性 开放封闭原则 开放闭合 程序对扩展是开放的,对修改是封装的。 即在不修...原创 2018-08-27 09:16:47 · 856 阅读 · 0 评论 -
linux C++ 类的静态成员函数与非静态成员函数的互访
前言:对象与对象之间的成员变量是相互独立的。要想共用数据,则需要使用静态成员和静态方法。只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进而可以使用静态成员变量。(因为静态成员变量在对象创建之前就已经被分配了内存空间)静态成员变量虽然在类中,但它并不是随对象的建立而分配空间的,也不是随对象的撤销而释放(一般的成员在对象建立时会分配空间,在对象撤销时会释放)。静态成员变量是...转载 2018-02-12 18:04:16 · 3301 阅读 · 0 评论 -
linux C++ 设计模式:单例、单例继承详解
一、单例1.1. 意图保证一个类仅有一个实例,并提供一个访问它的全局访问点。 1.2. 动机如何保证一个类只有一个实例,并且这个实例易于被访问呢?如希望系统中只有一个脱机打印机实例,只有一个访问配置文件的实例时。如果使用全局变量,将使得一个对象可以被访问,但它不能防止你实例化多个对象。 一个更好的办法是:让类自身负责保存它的唯一实例。这个类可以保证没有其...原创 2018-02-12 17:12:32 · 3092 阅读 · 2 评论 -
互斥锁的应用与pthread_mutex_destory的出错
一、互斥锁的应用互斥量从本质上说就是一把锁, 提供对共享资源的保护访问。1. 初始化:在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER. 对于动态分配的互斥量, 在申请内存(malloc)之后, 通过pthread_mutex原创 2017-12-29 23:41:47 · 14924 阅读 · 1 评论 -
用boost中的property_tree实现配置文件
property_tree是专为配置文件而写,支持xml,ini和json格式文件ini比较简单,适合简单的配置,通常可能需要保存数组,这时xml是个不错的选择。使用property_tree也很简单,boost自带的帮助中有个5分钟指南http://www.boost.org/doc/libs/1_46_1/doc/html/boost_propertytree/tutori转载 2015-12-17 14:19:18 · 679 阅读 · 0 评论 -
std::ostringstream用法详解
ostringstream是C++的一个字符集操作模板类,定义在sstream.h头文件中。ostringstream类通常用于执行C风格的串流的输出操作,格式化字符串,避免申请大量的缓冲区,替代sprintf。派生关系图:ios_base ostringstream的构造函数形式:explicit ostringstream ( openmode which = io转载 2015-12-17 14:12:59 · 6204 阅读 · 1 评论 -
C++Primer笔记 第八章 标准IO库
C++ 的输入/输出(input/output)由标准库提供。标准库定义了一族类型,支持对文件和控制窗口等设备的读写(IO)。还定义了其他一些类型,使 string对象能够像文件一样操作,从而使我们无须 IO 就能实现数据与字符之间的转换。这些 IO 类型都定义了如何读写内置数据类型的值。前面的程序已经使用了多种 IO 标准库提供的工具:? istream(输入流)类型原创 2013-06-23 11:20:24 · 1218 阅读 · 0 评论 -
C++Primer笔记 第四章 数组和指针
C++ 语言提供了两种类似于 vector 和迭代器类型的低级复合类型——数组和指针。与 vector 类型相似,数组也可以保存某种类型的一组对象;而它们的区别在于,数组: 长度是固定的。数组一经创建,就不允许添加新的元素。指针: 可以像迭代器一样用于遍历和检查数组中的元素。现代 C++ 程序应尽量使用 vector 和迭代器类型,而避免使用低级的数组和指针。设计良好的原创 2013-06-22 15:46:08 · 949 阅读 · 0 评论 -
C++Primer笔记 第六章 语句
6.1. 简单语句C++ 中,大多数语句以分号结束。例如,像 ival + 5 这样的表达式,在后面加上分号,就是一条表达式语句。表达式语句用于计算表达式。但执行下面的语句ival + 5; // expression statement却没有任何意义:因为计算出来的结果没有用于赋值或其他用途;1. 空语句程序语句最简单的形式是空语句,它使用以下的形式(原创 2013-06-22 17:26:37 · 755 阅读 · 0 评论 -
C++Primer笔记 第五章 表达式
C++ 支持操作符重载,允许程序员自定义用于类类型时操作符的含义。标准库正是使用这种功能定义用于库类型的操作符。表达式由一个或多个操作数通过操作符组合而成。最简单的表达式仅包含一个字面值常量或变量。较复杂的表达式则由操作符以及一个或多个操作数构成。每个表达式都会产生一个结果。如果表达式中没有操作符,则其结果就是操作数本身(例如,字面值常量或变量)的值。5原创 2013-06-22 16:48:26 · 1062 阅读 · 0 评论 -
C++Primer笔记 第三章 标准库类型
C++ 定义了内容丰富的抽象数据类型标准库,这些标准库类型是语言组成部分中更基本的那些数据类型(如数组和指针)的抽象,其中最重要的标准库类型是 string 和 vector,bitset;string : 支持大小可变的字符串;vector : 支持大小可变的集合,可用于保存一组指定类型的对象; 它们往往将迭代器用作配套类型(companion ty原创 2013-06-20 11:13:09 · 904 阅读 · 0 评论 -
C++Primer笔记 第一章 快速入门
1.1 编译与运行调用 GNU 编译器的默认命令是 g++, 如:$ g++ prog1.cc -o prog1运行:$ ./prog11.2 初窥输入/输出C++ 并没有直接定义进行输入或输出(IO)的任何语句,这种功能是由标准库提供;iostream 库的基础是两种命名:istream , 表示输入流ostream , 表示输出流原创 2013-06-19 11:06:02 · 883 阅读 · 0 评论 -
C++Primer笔记 第二章 变量和基本类型
2.1. 基本内置类型表 2.1. C++ 算术类型类型_____________含义___________________________最小存储空间____________bool boolean NAchar character原创 2013-06-19 11:38:46 · 811 阅读 · 0 评论 -
《微软:DirectShow开发指南》第12章 Writing DirectShow Source Filters
Of the three classes of Microsoft DirectShow filters—source, transform, and renderer—the source filter is the one that generates the stream data manipulated by the filter graph. Every filter graph has翻译 2012-08-01 22:36:19 · 2865 阅读 · 0 评论 -
《微软:DirectShow开发指南》第三章 Programming DirectShow Applications
Although sample DirectShow filter graphs can be constructed and tested in GraphEdit, application programmers want to use standard programming languages—either C or C++—to construct DirectShow applicat翻译 2012-07-29 10:42:23 · 3086 阅读 · 0 评论 -
《微软:DirectShow开发指南》第4章 Capturing Audio with DirectShow
The next four chapters of this book deal with Microsoft DirectShow applications that capture media streams for manipulation by DirectShow. In most of the examples to follow, the streams will simply be翻译 2012-07-29 17:46:38 · 2535 阅读 · 0 评论 -
extern"C"使用详解
一、简介extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。让我们来详细解读这两重含义。二、含义(1) 被extern限定的函数或变量是extern类型的:a. extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,可以在a.c中声明 ex转载 2013-06-27 17:45:39 · 1000 阅读 · 0 评论 -
linux下C++动态链接C语言库
Linux下的动态链接库是.so文件,即:Shared Object,下面是一个简单的例子说明如何写.so以及程序如何动态载入.so中的函数和对象。//testso.h: #ifndef _TESTSO_H #define _TESTSO_H extern "C" { int myadd(int a, int b); type转载 2013-06-27 17:58:45 · 1222 阅读 · 0 评论 -
gcc与g++的区别与联系
gcc和g++都是GNU(组织)的编译器。一、误区详解误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的文件, gcc把它当作是C程序,而g++当作是c++程序; 后缀为.cpp的,两者都会认为是c++程序, 注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。 C++的语法规则更加严谨一些。原创 2013-06-27 23:14:28 · 1211 阅读 · 0 评论 -
std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已。std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移问题。这导致多个std::auto_ptr类型的局部变量不能共享同一个资源,这个问题是非常严重的哦。因为,我个人觉得,智能指针内存管理要解决的根本问题是:一个堆对象(或则资源,转载 2015-12-17 14:43:57 · 1794 阅读 · 0 评论