自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 资源 (2)
  • 收藏
  • 关注

原创 <九>Pimp设计习语

Pimp

2023-12-11 10:08:59 341

原创 <八>异常机制

• 只有特殊的硬实时系统对时间开销(异常抛出时),或者嵌入式系统对空间开销(代码膨胀)极度敏感时,才关闭异常(决策前测量)针对异常中立的函数(自己不抛,但调用的函数可能会抛),不要试图捕获所有异常,来实现noexcept。• C++11废弃了异常规约(列举函数可能抛出的异常),而采用noexcept表示是否抛出异常。• throw 抛出异常, try 包含可能抛异常的语句块,catch 语句捕获异常。• 异常不抛出时没有额外性能负担,只有抛出时才有(比错误码大)只有移动操作不抛出异常,才使用移动;

2023-12-05 17:19:58 368

原创 <一>Observer 观察者模式

定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新以 下载过程发出进度通知 为例//版本一public://1.网络下载准备//2.文件流处理//3.设置进度条i++){//...//4.文件存储int main()//详细代码省略在上面的代码问题,在FileDownload代码中带着界面层代码版本二public:public://1.下载动作//2.设置进度。

2023-12-04 10:08:52 330

原创 <一>关于继承和多态

C++继承和多态

2023-11-30 09:09:58 316

原创 <一>C++ 对象内存模型——继承

C++继承对象内存模型

2023-11-28 16:08:09 406

原创 <七>C++项目中戒除C语言的“不良习惯”

• 当一定要用C 时,应使用C 和C++ 的公共子集,并将C 代码以C++ 来编译。• 辨析使用场景和对象所有权,谨慎使用裸指针。• 使用模板和编译时计算等替换C风格的宏机制。• 严格避免malloc() 和free()• 使用C++类型转换替换C风格的强制转换。• 尽量避免全局数据,谨慎使用全局函数。

2023-11-23 17:12:17 16

原创 <六>字符串最佳实践

C++字符串最佳实践

2023-11-23 17:09:38 16

原创 <五>数组最佳实践

•使用vector实现变长数组,替代堆上的C风格数组。•使用array实现定长数组,替代栈上的C风格数组。•不要使用指针传递数组,传递指针仅代表单个对象。•不要使用C风格数组承载多态对象(基类、子类)•不带长度信息,易错点:拷贝、传参、返回值。•尽量避免使用C风格数组,有很多安全隐患。•本质是指针指向的一块连续内存,引用语义。

2023-11-23 17:04:28 20

原创 <三>特殊成员函数与三法则

特殊成员函数与三法则(Rule of Three)• 四大特殊成员函数• 默认构造函数(无参), 如果不定义任何拷贝构造,编译器自动生成• 析构函数/ 拷贝构造函数/ 赋值操作符,如果不定义,编译器自动生成• 使用default 让编译器自动生成。• 使用delete 让编译器不要自动生成。• 三法则:析构函数、拷贝构造函数、赋值操作符三者自定义其一,则需要同时定义另外两个,特别是有堆对象指针成员(编译器自动生成的一般语义错误)。(C++98)

2023-11-22 10:02:50 29 1

原创 <二>C++对象模型基础

• 按照实例数据成员声明顺序从上到下排列(与C语言保持兼容)• 对象内存对齐是为了优化CPU存储数据效率、避免数据截断。• 可使用#pragma pack(4)控制。• 简单优化:长字段放前,短字段置后(聚集)• 按对齐系数(4字节、8字节)整倍数。虚函数指针占用一个指针size。• C++对象内存布局。• 内存对齐与填充——

2023-11-20 15:01:41 24 1

原创 <一>基于对象编程

• 数据成员(字段) + 函数成员。• 实例成员与this指针。

2023-11-20 14:45:58 21 1

原创 <九>指针和引用

• 尽可能避免以原始指针(T*)或引用(T&)来传递所有权(使用智能指针传递所有权)。• 辨析指针、引用所指向对象的存储位置、生命周期、以及是否拥有对象所有权。

2023-11-20 11:20:15 29 1

原创 <八>裸指针万恶之源

• 分配与删除错误匹配—— new和free搭配,malloc和delete搭配,new和。• 悬浮指针—— 使用已释放内存(读取、或写入)、返回栈对象地址。• 删除非堆对象指针——对栈对象、全局/静态对象地址进行删除。• 对象类型不清晰(栈对象、堆对象、数组对象、资源句柄?delete搭配,new[]和delete[] 搭配。• 重复删除—— 对已经删除过的对象,进行二次删除。• 内存泄漏——忘记delete之前new的内存。• 使用失效引用(悬浮引用,悬浮指针)• 所有权不清晰(谁分配,谁释放?

2023-11-20 10:56:48 28 1

原创 <四>关于变量生命周期和初始化

• 统一初始化:int a1{100};• 基本数值类型,以及auto自动推断类型声明,可以继续使用赋值初。• 大多数情况推荐使用统一初始化,又叫列表初始化,特别是对象、• 和表达式周期一致,通常类似自动对象(绑定引用除外)• 全局变量,函数中的静态变量,类静态数据成员。• 自声明开始,到声明语句所在块结尾}释放。• 随线程创建而创建,随线程结束而释放。• 构造初始化:int a4(100);• 赋值初始化:int a3=100;• 程序启动后加载,程序结束释放。• 堆变量,自由存储对象。

2023-11-17 09:30:26 21 1

原创 <三>值语义与引用语义

• 值语义有很多好处:没有悬浮指针/引用,没有昂贵的释放操作,没有内存泄漏,没有数据竞争……但是值语义大对象拷贝代价高昂,不能支持虚函数多态,不能维持对象全局唯一性……• 引用语义:对象以指针或引用的方式间接存储,参数、返回值、拷贝传递的是指针或引用。不存在特权类型或限定(其他语言则不,这是C++的独特性之一)。• 值语义:对象以值的方式直接存储,传参、返回值、拷贝等。对内置类型和用户自定义类型提供同等支持。

2023-11-16 12:14:44 23 1

原创 <二>关于栈内存和堆内存

• 栈内存有大小限制,可能会溢出,例如Linux默认为8MB,Windows默认为1MB。• 堆内存有很高灵活性,虽性能较差,但可通过相关设施和编程技巧精细控。• 堆内存大小没有栈内存严格限制,与机器内存总量和进程寻址空间相关。• 如果生存周期短,拷贝较少(传参、返回值),栈内存性能更好。• 堆内存在长运行程序有内存碎片效应,小块空闲内存得不到重用。• 对象释放时,手动释放堆内存(delete/free)• 栈上对象线性分配,连续排列,没有内存碎片效应。• 栈内存分配快,布局连续,缓存友好,释放快。

2023-11-16 11:14:31 28 1

原创 <一>关于进程虚拟地址空间区域内存划分和布局

在上面给出的进程地址空间经典布局图中,共享库的装载地址为0x40000000,这实际上是Linux kernel 2.6版本之前的情况了,在2.6版本里,共享库的装载地址已经被挪到靠近栈的位置,即位于0xBFxxxxxx附近,因此,此时的堆范围就不会被共享库分割成2个“碎片”,故kernel 2.6的32位Linux系统中,malloc申请的最大内存理论值在2.9GB左右。泄漏的内存往往比忘记释放的数据结构更大,因为所分配的内存通常会圆整为下个大于申请数量的2的幂次(如申请212B,会圆整为256B)。

2023-11-16 11:11:41 41 1

原创 <七>智能指针之__强弱指针使用场景之 多线程访问共享对象问题

weak_ptr是对对象的一种弱引用,它不会增加对象的use_count,weak_ptr和shared_ptr可以相互转化,shared_ptr可以直接赋值给weak_ptr,weak_ptr也可以通过调用lock函数来获得shared_ptr。即使有weak_ptr指向对象,对象也还是会被释放。weak_ptr并没有重载operator->和operator *操作符,因此不可直接通过weak_ptr使用对象,典型的用法是调用其lock函数来获得shared_ptr示例,进而访问原始对象。

2023-05-31 08:30:00 74 1

原创 <六>内存分配&智能指针内存泄漏问题

【代码】<六>内存分配&智能指针内存泄漏问题。

2023-05-30 10:52:56 147 1

原创 <五>智能指针之__自定义删除器

但是这种方式也只能处理new出来的空间因为new要和析构中的delete匹配,为了使能和fopen的管理空间匹配,我们需要定制删除器。unique_ptr的成员函数在上面的博客中几乎全部涵盖,其实还有一个知识点,即std::unique_ptr::get_deleter字面已经很明显了,就获得deleter。加入lambda表达式和function,避免多个删除器类的定义,否则每自定义一个删除器,都要去写一个对应的类,太麻烦。通过自定义删除器,可以实现一些场景下的资源释放和删除.

2023-05-25 21:18:53 317 1

原创 <四>智能指针之__最佳实践

【代码】<六>智能指针之__最佳实践。

2023-05-23 21:11:39 43

原创 <三>智能指针之__sharePtr

所以这个对象B 引用计数是2,当ptrb退出main函数栈 ,计数减1,计数还剩1,所以B对象没有被销毁。所以这个对象A 引用计数也是2,当ptra退出main函数栈 ,计数减1,计数还剩1,A对象没有被销毁。第一步 ptrb 先销毁,从上图中可以看到除了自己指向了对象B, 堆上还有一个指针指向了这个B。第二步:ptra销毁,ptra销毁的时候发现除了自己指向对象A,还有个堆对象指向了对象A,**怎么解决上述三段代码的问题?

2023-05-22 22:31:17 752 1

原创 <二>智能指针之__unique_ptr

C++智能指针unique_ptr

2023-05-21 16:27:09 47 1

原创 <一>智能指针之__智能指针基础

weak_ptr是对对象的一种弱引用,它不会增加对象的use_count,weak_ptr和shared_ptr可以相互转化,shared_ptr可以直接赋值给weak_ptr,weak_ptr也可以通过调用lock函数来获得shared_ptr。weak_ptr并没有重载operator->和operator *操作符,因此不可直接通过weak_ptr使用对象,典型的用法是调用其lock函数来获得shared_ptr示例,进而访问原始对象。2:带引用计数的智能指针(share_ptr,weak_ptr)

2023-05-19 17:40:24 86 2

fontbox 2.0.jar

fontbox 2.0.jar fontbox 2.0.jar fontbox 2.0.jar fontbox 2.0.jar

2018-07-28

pdfBox 2.0.jar

pdfbox 2.0.jar 可用当前最新的版本pdfbox 2.0.jar 可用当前最新的版

2018-07-28

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除