C/C++
文章平均质量分 77
C/C++
他过江
分享C/C++/Linux/Qt/音视频/FFmpeg/OpenCV等相关技术。
展开
-
C++多态虚函数实现原理,对象和虚函数表的内存布局
基本概念我们知道C++动态多态是用虚函数实现的,而虚函数的实现方式虽说C++标准没有要求,但是基本都是用虚函数表实现的(编译器决定)。所以我们有必要了解一下虚函数表的实现原理。用virtual关键字声明的成员函数是虚函数。具有虚函数的类及其派生的类会在编译时创建虚函数表,简称虚表(vtbl),虚表是虚函数指针的数组。具有虚函数的类对象有一个虚表指针(vfptr),是编译器生成的指针,在对象构造时初始化。虚表指针vfptr指向虚表的第一个虚函数指针(即vfptr的值是虚表第一个...原创 2022-05-17 21:53:37 · 2919 阅读 · 37 评论 -
指针和内存错误
/*读取字符串中的字符出错(无法读取内存)*/1、该处代码未执行(变量未初始化,赋值)2、未正确分配内存3、越界访问0x00000000 处(位于 xxx.exe 中)引发的异常: 0xC0000005: 执行位置 0x00000000 时发生访问冲突。解:导入动态库失败,指针为空(一般是写错了)Run-Time Check Failure #3 - The vari...原创 2017-08-26 00:37:38 · 3314 阅读 · 1 评论 -
const char*(字符串常量)能否赋值给char*
上面 这行代码再VS2015是能正常编译的。而VS2017直接报错:然后再看看linux平台如何,测试环境:ubuntu1604 gcc version 5.4.0用gcc编译通过用g++编译也能通过,不过会警告:我们知道字符串常量是位于静态存储器,内存只读。所以正常使用应该如下:const char *p = "hello";为什么会出现上面的不同,SO上看到一个回答:意思是字符串常量在C中是char数组,在C++中是const char数组,C++为了兼...原创 2021-07-20 00:45:39 · 7914 阅读 · 0 评论 -
JNI调用C++动态库
将jdk中的jni.h和jni_md.h拷贝的VS的包含目录 实现test.java文件 javac test.java 生成java.class文件 javah test(java类名) 生成test.h文件 C++实现test.cpp文件 cl.exe /LD test.dll 生成动态库(.dll/.so)注意JKD的位数要和cl.exe位数相同。.java文件可能要改成gbk编码。...原创 2020-10-29 19:33:49 · 293 阅读 · 0 评论 -
C++ STL容器笔记
以下内容参考Effective STL和Effective Modern C++1. map和set是按key排序的,不是按插入顺序排序的 现在更推荐用QVector而不是QList2. vector查找方便,list增删方便,set介于两者之间3.容器分类:顺序容器(连续内存):vector,string,deque关联容器:map,set,multimap,mul...原创 2019-09-01 22:28:14 · 320 阅读 · 0 评论 -
C++ assert和异常捕获的对比
异常捕获(exception)和断言(assertion)的使用场景:异常捕获:内存不足,运行时异常,用户输入错误(JSON格式不正确),数据库连接错误,IO错误断言:写该代码的人造成的错误,例如指针为空(assert(nullptr!=p);)一般生产环境不使用assert,因为会造成崩溃。而异常捕获可用于给用户反馈,例如在HTTP服务中,用户发送的消息格式不正确(JSON格式非...原创 2019-08-02 21:28:22 · 1772 阅读 · 0 评论 -
C++二进制兼容性问题
一开始是在Qt的D-Pointer中知道二进制兼容性这个概念。二进制兼容性是什么?当动态库更新的时候,如果使用该动态库的应用程序不需要重新编译,我们就说这是二进制兼容的。例如我们可以更换Qt动态库而不需要重新编译应用程序,应用程序可以继续运行。为什么要保证二进制兼容性?因为违反二进制兼容的行为容易出错,UB,设置崩溃。什么行为会破坏二进制兼容?什么行为不会?破坏二进制兼容性...原创 2019-07-18 23:27:46 · 923 阅读 · 0 评论 -
C/C++函数调用约定
函数调用约定就是函数调用者和被调用者之间的约定。函数调用约定决定了参数怎么传递以及由谁来平衡堆栈。不同的编译器实现不一样。调用约定不显示指定的话默认是__cdecl。这里主要讨论__cdecl和__stdcall共同点:__cdecl和__stdcall参数入栈顺序都是从右到左 不同点:__cdecl由调用者清理堆栈,__stdcall由被调用者清理堆栈。 由于条件1的关系,约定...原创 2019-06-07 21:48:44 · 620 阅读 · 0 评论 -
std::bind绑定std::shared_ptr出现的问题
using msgCallback = std::function<void()>;class A {public: ~A() { cout << "A::~A()" << endl; } void output() { cout << "A::output()" << ...原创 2019-05-14 00:00:46 · 3375 阅读 · 0 评论 -
C++并发实战第二章笔记
线程在std::thread对象创建的时候启动,而类似Java或Qt的线程,线程在调用start()函数时启动使用有调用运算符的类实例作为thread实参:class background_task{public: void operator()() const { do_something(); do_something_else(); }};ba...原创 2019-01-30 22:24:10 · 280 阅读 · 0 评论 -
C++11计算时间差
#pragma once#include <chrono>#include <ratio>using namespace std::chrono;class Timer {public: using s = std::ratio<1, 1>; using ms = std::ratio<1, 1000>; using us =...原创 2019-01-09 00:37:05 · 2199 阅读 · 0 评论 -
C++笔记
访问控制与继承:protected:1.和私有成员类似,受保护的成员对于类的用户不可访问2.和公有成员类似,受保护的成员对于派生类的成员和友元可访问3.派生类的成员和友元只能通过派生类对象访问基类受保护成员。派生类对于基类对象的受保护成员没有任何访问权限C++ 将对象的构造和析构函数声明为Protected的结果类型转换:先看类是否有操作符重载函数,如果有,使用对应的构造函数然后看类是否具有类型转换函数lambda:定义:理解为未命名的内原创 2017-11-10 14:28:31 · 319 阅读 · 0 评论 -
C++单例模式
//饿汉模式 在程序创建的时候(main函数之前)单例实例被初始化class Singleton {public: static Singleton & GetInstance() { return m_instance; }private: Singleton() {} ~Singleton() {} static Singleton m_instance;};...原创 2019-01-08 22:56:48 · 366 阅读 · 0 评论