C/C++
segment-fault
这个作者很懒,什么都没留下…
展开
-
C++单例模式的一种实现
C++单例模式通过static变量实现单例实例代码:class signalCase {public: signalCase& Instance() { static signalCase *instance(new signalCase()); return *instance; }protected: signalCase()原创 2017-11-13 21:15:45 · 175 阅读 · 0 评论 -
C/C++ const修饰符
constconst在C/C++中的作用基本一致1. 声明变量2. 声明指针通过const修饰后,不符合const用法的操作将导致编译器的编译错误也就是说,const是编译时检查.声明变量const int a = 10;a被声明为常量,值只能为10.试图修改将导致编译的error此时const的位置排布不影响语义.声明指针这里有两个用法int原创 2018-01-28 23:49:14 · 259 阅读 · 0 评论 -
cJSON_Delete调用时segmentfault
cJSON_DeletecJSON_Delete释放cJSON构造object时申请的内存资源通常用法 cJSON *json = cJSON_CreateObject(); ... ... cJSON_Delete(json);调用cJSON_Delete时产生segmentfault错误段代码: cJSON *json = cJSON_原创 2018-01-20 21:29:00 · 6923 阅读 · 1 评论 -
智能指针之scoped_ptr的实现
scoped_ptrscoped_ptr正如其字面意思 scoped:作用域 scoped_ptr只实现了智能指针的通用特性:栈管理堆当超出当前作用域时,scoped_ptr释放指向的对象.scoped_ptr的实现智能指针的大致原理: 智能指针内部都会保存一个指向保存对象的指针 调用reset或构造时,指针指向一个对象 调用release或超出作用域(即自动析构),指针不再...原创 2018-02-10 21:35:53 · 575 阅读 · 0 评论 -
WebRTC base模块scoped_refptr指针的实现
scoped_refptrscoped_refptr和scoped_ptr虽然名字相近,但在智能指针的特性上有很大差别.scoped_ptr利用作用域管理对象:实现原理:http://blog.csdn.net/qq_21358401/article/details/79307072而scoped_refptr并不直接申请和释放对象,主要通过指向的对象自己实现申请和释放.Ad...原创 2018-02-10 22:07:50 · 2655 阅读 · 0 评论 -
C++禁用拷贝构造
拷贝构造C++的拷贝构造有点类似于C的结构体拷贝,根据现有的对象拷贝给另一个对象.一般来说C++编译器会自动给类生成拷贝构造函数(前提是调用的代码中有拷贝构造的行为),但如果类已经定义了拷贝构造函数 则编译器不会再去生成.利用这个特点: 代码中如果不希望某个类被拷贝构造,则可以通过重载拷贝构造函数,并声明为private属性来实现.示例代码 1 #inclu...原创 2018-02-10 22:21:58 · 2206 阅读 · 1 评论 -
Android JNI C/C++调用Java方法
JNI环境的支持Android JNI编程从Java方法来调用native方法是比较容易的,因为Java本身就提供了native关键字作为索引,只要正确的对应Java方法和native方法的包名,做到这一步并不难.而从C/C++方法调用Java方法则稍复杂一点,因为C/C++没有提供跨语言调用的直接支持,所以需要由Java的JNI运行环境来提供帮助.每一个JNI native方法的原创 2018-02-05 22:43:56 · 2266 阅读 · 0 评论 -
C/C++代码嵌入汇编
在C代码中嵌入汇编代码在非常看重代码性能的场合,可以通过替换关键过程的代码为汇编代码来提升性能.GCC支持通过关键字 __asm__来嵌入汇编代码段,当编译器编译到这一段代码时,会直接将__asm__字段内的代码链接到目标中.汇编代码为什么能提升性能?事实上并不是汇编代码提升了性能,准确的说法应该是合理的汇编代码提高了性能.因为C/C++代码在编译时同样会被编译为汇编代码,但是编译器原创 2018-02-07 13:59:35 · 1297 阅读 · 0 评论 -
C++前向声明(解决类的互相包含问题)
类的互相包含假设有两个类#include "B.h"class A {private: B *b;};#include "A.h"class B {private: A *a;};编译时编译器会提示类A或类B未定义 这是由于两个类互相引用对方造成类似先有鸡还是先有蛋的问题 编译器无法正常的按顺序编译代码前向声明C/C++支持前向声明 ...原创 2018-02-27 22:02:11 · 516 阅读 · 0 评论 -
Android Java和C/C++的交互
Java和C/C++关于交互1. Java调用C/C++方法 Android JNI介绍: http://blog.csdn.net/qq_21358401/article/details/78680772 JNI中Java对象调用C/C++及Java对象和C++对象的对等封装方法 http://blog.csdn.net/qq_21358401/article/...原创 2018-02-08 15:21:02 · 1416 阅读 · 0 评论 -
C/C++ 备份函数的指针参数
指针参数在C/C++代码中常见这样的写法void p_ptr_test(char *ptr) { char *p = ptr; // ...}函数参数传入一个指针参数时 会复制一个指针来操作 而不直接操作指针参数函数参数C/C++函数的参数是变量的复制值 对于指针参数来说 复制的变量指向的地址不变void p_ptr_test(char *ptr) ...原创 2018-03-09 14:10:24 · 396 阅读 · 0 评论 -
数据结构:通用链表
linux/list.hlinux内核中使用的链表特点是可以复用,无需反复造轮子.容易想到的一种链表用法是这样的:struct list{ strucu list *next, *prev; int priv_data;};数据被储存在链表的节点内部 通过next和prev移动来访问各个节点上的priv_data.这样做的问题在于代码几乎没有复用性,不同的数据存...原创 2018-02-06 00:31:52 · 306 阅读 · 0 评论 -
内部类:Java和C++的不同实现
内部类内部类是在一个类中定义的另一个类Java和C++都支持这么做,且内部类和继承是不同的,这两种行为在内存排布上截然不同.举C++为例:继承:class Derived : public Base {xxx};内部类:class Derived {public: class Base { xxx };};同样是在内存中实例化一个对象 De...原创 2018-02-24 17:56:04 · 335 阅读 · 0 评论 -
匿名函数
匿名函数匿名函数是没有名字的函数 是高级语言发展出来的新特性一些实现了匿名函数的高级语言: 1. C++ : lambda表达式(C++11) 2. Java :lambda表达式(Java8) 3. object-c :块匿名函数的好处在于精简程序的设计在代码的逻辑中,可能存在一些只需要调用一次或几次的函数C语言中的做法是命名一个函数来实现它 但这样显得太繁琐引入匿名函...原创 2018-04-09 21:20:36 · 947 阅读 · 0 评论 -
C/C++ #define的作用域
#define#define macro的作用域有点类似于C/C++全局静态变量编译器处理宏的时机是预处理阶段 编译器按文本顺序处理 遇到宏时就定义一个宏变量假设这种情况void test() {#define MACRO 1}int main() {#ifdef MACRO// do some thing#endif}main函数也是看得到MACRO宏的 因...原创 2018-05-24 16:00:27 · 8805 阅读 · 0 评论 -
C++分割字符串
按关键字分割字符串 1. 按关键字分割成vector<string>实现#include <iostream>#include <vector>#include <string>using namespace std;vector<string> split(const string &src, c...原创 2018-06-14 09:28:54 · 824 阅读 · 0 评论 -
C++智能指针
智能指针 smart ptr智能指针的目的在于利用栈会被程序自动销毁的特性来进行内存管理,避免内存泄漏问题,也就是用栈来管理堆.C++标准中的智能指针包括std::auto_ptr(C++98),std::shared_ptr(C++11),std::unique_ptr(c++11),std::weak_ptr(c++11)除去标准之外,还有一些比如scoped_ptr(boost)原创 2018-02-04 21:06:25 · 959 阅读 · 1 评论 -
C/C++混合编程
C/C++混合编程C++ 调用 C 的步骤比较简单,只需要将C的代码使用extern “C”包含声明即可cpp: int main() { c_fun_xxx(); }c: extern "C" { int c_fun_cxx(); }通过extern “C“的声明,编译器会将声明部分按照C的语法进行编译C调用C++C调用C+原创 2017-08-06 23:53:35 · 360 阅读 · 0 评论 -
程序退出前清理: signal
垃圾清理操作举例:在SDL的应用程序中, 程序退出前需要执行SDL_Quit来主动退出并释放SDL窗体,否则窗体会任然停留在桌面并且下一次创建SDL窗体将会不起作用.可以采用signal函数来注册退出前的清理函数signal#include #include <stdio.h>#include <signal.h>void *user_exit(int handle) { printf("原创 2017-11-13 21:33:55 · 1466 阅读 · 0 评论 -
C++ 实现复用第三方库的方法名
方法名重复时的应对假设有以下情况class test {public: test(){}; ~test(){}; double sin(double); double call_sin(double num, int flag);};sin函数在c标准库里的math.h已经提供 但你并不想在所有场合都使用标准库的sin 而自己在类里也实现了一个sin 通过封装的原创 2017-12-03 22:10:07 · 298 阅读 · 0 评论 -
C++纯虚函数实现接口
C++纯虚函数纯虚函数语法 virtual type functionname()=0;virtual声明的方法后加上=0是纯虚函数 Java Interface接口Java 中使用Interface开放接口,让另一个类implements interface来达到逻辑和接口分离的作用 Java Interface接口C++实现接口利用两个特性 1. 纯虚函数必须被派生类实现原创 2017-12-13 14:29:28 · 3441 阅读 · 1 评论 -
C/C++ 实现类似Android JNI log库的效果
封装logC标准库提供了printf作为日志输出函数 C++中stl提供了std::cout作为日志输出函数当然这两种接口使用起来都不太方便 printf函数太长 而且日志没有分级别 cout使用起来则更为繁琐std::cout << "test" << std::endl;封装printf常见的封装方法是这样的:#define log(fmt,...)\ do {\原创 2017-12-21 15:24:35 · 293 阅读 · 0 评论 -
posix线程的误区: 线程是否启动
pthread_create创建线程一直以来 我都有一个关于posix线程使用的误区 那就是pthread_create接口创建了线程 但并没有直接启动它 线程的启动必须要由pthread_join或是pthread_detach来完成产生这个误区的主要原因是由于posix的代码通常是这样写的#include <stdio.h>#include <pthread.h>void *funThre原创 2017-12-22 00:16:14 · 279 阅读 · 0 评论 -
coding总结
coding总结好的代码一定是调试出来的开发任何程序 应该首先建立一个好的debug环境 可以是来自ide的ui调试环境 包括封装了gdb的界面或是windows下的 visual studio嵌入式开发应该在程序中插入可调试手段 例如gdb-server或是代码中植入ssh shell类型代码,http控制等 嵌入式开发中由于条件所限 经常存在debug仅通过插入log实现 这种做法在代码还原创 2017-12-02 16:14:28 · 228 阅读 · 0 评论 -
socket.io-poco
socket.io-pocogithub仓库地址: https://github.com/himynameschris/socket.io-pocosocket.io-poco是一个C++写的socket.io协议栈 用来和node.js服务端进行socket.io通讯 依赖于poco库和cmake编译流程1. git clone https://github.com/himynameschris原创 2017-12-25 21:16:11 · 421 阅读 · 8 评论 -
C++ 实现类似Qt和Java的线程用法
封装线程在使用Qt和Java的时候 使用线程的方式是这样的Qt:class threadRun : public QThread {...protected: void run();...}然后实现继承的run方法void threadRun::run() { ...}run中执行的代码将会被投递到一个线程中执行Java中继承Thread 或者 实现Runnable原创 2017-12-21 00:08:11 · 457 阅读 · 0 评论 -
Android JNI : Java封装C++
Java封装C++将C++类 和 Java类对等起来实例化一个Java对象就相当于实例化了一个C++对象实现原理指针实质上也是个int或long(视平台而定)类型的变量在jni方法中实例化c++对象后 返回给java方法 并转化为long变量java方法根据这个得到的long型'句柄' 可以做一系列的对某个C++对象的操作包括申请 释放等等C++:class te原创 2018-01-12 18:05:15 · 1150 阅读 · 0 评论 -
C++: 模板 模板特化 模板偏特化
C++模板模板是C++的一个重要特性 使用模板 可以极大的减少类似功能代码的编写这可以看做是C++相较于C的进步 因为这一特性在C中是不容易达到的(语言层面不支持)模板的关键字是 template简单的模板应用:template <typename T>class test {public: void Bigger(T a, T b) { return a > b ?原创 2017-12-28 21:55:54 · 673 阅读 · 0 评论 -
C++:多态
多态:虚函数实现C++的多态是由虚函数实现的 原来写过一篇利用C++的纯虚函数实现类似Java interface接口功能的blog http://blog.csdn.net/qq_21358401/article/details/78791563实际上 普通虚函数也可以达到这种效果 只是缺少了纯虚函数必须被派生类实现的特性 不利于编译期间的自我错误检查多态和重载的区别未完待续…原创 2017-12-28 22:05:59 · 147 阅读 · 0 评论 -
c-style string std::string QString的转换
c-style string 和c++ std::string的转换c风格的字符串转换为c++ std::string 构造一个std::string对象 char *str = "sliver"; std::string(str);c++ std::string转换为c风格的字符串 c++ string提供了c_str方法 std::string str = "原创 2018-01-08 17:26:41 · 344 阅读 · 0 评论 -
pthread-线程分离和聚合的差别
线程分离和聚合posix线程支撑linux上的多线程使用 线程有两个截然相反的属性 分离和聚合 该属性分别由两个接口设置 聚合: int pthread_join(pthread_t thread, void **retval); 分离: int pthread_detach(pthread_t tid);分离和聚合属性的差别线程被设置为聚合后 会在原地等待这个线程的退原创 2017-12-20 20:59:28 · 953 阅读 · 0 评论 -
C/C++初始化和去初始化函数
init/deinit初始化/去初始化函数根据作用域可以分为几种不同的应用情形 1. 全局初始化/去初始化 这一次运行程序只做这一次初始化/去初始化 2. 模块初始化/去初始化 每次加载/卸载这个模块都调用一次初始化/去初始化全局初始化以ffmpeg为例 需要首先调用av_register_all接口注册所支持的编解码器等等一般只需要程序运行时注册一次 程序...原创 2018-06-10 16:24:21 · 13915 阅读 · 1 评论