C\C++
文章平均质量分 73
博主学习C\C++过程中的总结和遇到的问题的解决方案。
CodeBowl
一个靓仔!
展开
-
内存管理整理V1
2023.04.19今天阅读《C专家编程》第七章 对内存的思考,结合小林codin网站的学习笔记及扩展。原创 2023-04-19 22:34:19 · 311 阅读 · 1 评论 -
std::thread创建线程,使用std::ref()传递类对象参数
stdref只是尝试模拟引用传递,并不能真正变成引用,在非模板情况下,stdref根本没法实现引用传递,只有模板自动推导类型时,ref能用包装类型reference_wrapper来代替原本会被识别的值类型,而reference_wrapper能隐式转换为被引用的值的引用类型。thread在使用类对象作为参数传递过程中,常常会出现多次拷贝构造的情况,理想中的情况是只需一次拷贝构造。stdref主要是考虑函数式编程(如stdbind)在使用时,是对参数直接拷贝,而不是引用。...原创 2022-07-24 14:59:00 · 1224 阅读 · 0 评论 -
C++并发编程:线程安全链表
最近遇到这么一个问题,一个处理路径的函数,在多线程中被调用,我需要记录某个状态的路径,并在后续当再次处于某个状态时,从链表中将其取出。为了满足这个需求,用来存储的数据结构要满足: 1. 线程安全:防止在多线程中错误地对一个变量进行修改 2. 便于查询 3. 便于插入、删除 最终想来选择了线程安全的链表,同时备选的队列,但队列不满足便于查询。...原创 2022-07-24 14:43:45 · 1950 阅读 · 0 评论 -
C++调试内存泄漏
内存泄漏(memory leak) 是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。...原创 2022-06-20 23:27:58 · 588 阅读 · 0 评论 -
不要再用if/else和switch/case了,快使用“表驱动法”代替,面向对象思维,对修改关闭。
表驱动是一种编程模式,是一种将输入变量作为索引在表里查找直接的结果或者处理函数,而不是用很多的逻辑语句来进行判断(比如if-sle||switch_case).索引表可以是个数组、map或者其他高效率查找的数据结构。...原创 2022-06-13 23:08:27 · 753 阅读 · 0 评论 -
std::string自带“/0”吗?怎么将string拷贝到char*?
std::string自带“/0”吗?怎么将string拷贝到char*?结论将string拷贝到char*字符串结论先说结论,string时不带“/0”的。这个问题在网上一直有很多种说法,我之前也一直认为string的结尾是自带“/0"的,但是在进行string拷贝到char*字符串的时候,发现了不对劲!我猜测的解释:c语言用char*指针作为字符串时,在读取字符串时需要一个特殊字符0来标记指针的结束位置,也就是通常认为的字符串结束标记。而c++语言则是面向对象的,长度信息直接被存储在了对象原创 2021-12-28 22:59:03 · 1846 阅读 · 0 评论 -
C++设计模式:抽象工厂模式
抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。原创 2021-12-11 21:04:10 · 2977 阅读 · 0 评论 -
C++接口设计的心得体会
今天在模块接口设计的时候,对如何设计一个好的接口,产生了疑惑。遂请教了俩位师傅,得到了俩条建议,私以为十分有用!原创 2021-12-02 00:04:52 · 712 阅读 · 0 评论 -
用RAII的思想去管理Windows的读写锁SRWLock
前言最近对C++的RAII(资源申请初始化),又有了新的理解。我们C++中使用一个资源(例如 内存)的步骤:申请资源使用资源释放资源简述一下RAII:就是可以自动回收资源,将资源封装成对象。关键在于:变量的生命周期结束后,会自动释放变量。例如一个变量是局部变量,存储在栈上,那么当该函数结束后,这个变量就已经被释放掉了。那么,当变量是类变量的时候,当该类对象变量生命周期结束后,应该调用析构函数释放掉该资源!生命周期局部变量:存储在栈上,生命周期结束后,由栈释放。全局或静态变量:原创 2021-11-23 23:02:03 · 561 阅读 · 0 评论 -
工程实践:到底要不要使用智能指针
前言写了很久的“C with class”,在接触到智能指针的时候,都有点欣喜若狂了,想的是,这下子不用再为new/delete头疼了,也不用担心内存泄漏了,但事实证明我太天真了。之前也学过modern cpp,甚至还总结过智能指针,但是看来没有实际的操作,空想还是太虚了!本文仅作新手经验所记,必不全面智能指针现状auto_ptr: 跟98的前辈say goodbyeunique_ptr:shard_ptr:我这个人擅长模仿学习,看见别人的代码里用的都是shared_ptr,所以在一段时间原创 2021-11-16 23:25:12 · 984 阅读 · 1 评论 -
智能指针不是解决内存泄漏的万能良药
背景最近在重构一个模块,模块中的接口有指针参数,我想把他改成智能指针,凡是接口要保持不变,就很难修改。接口类似func(int ** p1),不知道怎么用shared_ptr代表。**然后我就进行了一系列骚操作!从而也发现了智能指针的不当使用带来的内存泄漏和悬空指针的问题。内存泄漏内存泄漏(MemoryLeak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。悬空指针在C/C++等语言中,悬空指针(Dangl原创 2021-11-16 22:22:04 · 836 阅读 · 0 评论 -
工程实践之路:C++接口设计中的工厂模型
工程实践之路:C++接口设计中的工厂模型设计模式之工厂模式为什么使用工厂模式1.工厂设计模式是为了将对象的创建与使用进行分离2.其他好处简单工厂模式工厂方法模式抽象工厂模式参考资料上一篇文章写了《工程实践:C++接口设计指北》主要写了用C++写第三库,如何设计接口的问题,其中用到了工厂模式,在此之前,一直不太明白《设计模式》在实际开发中的应用。现在正好被我逮到了,以此为例,深入学习一下!设计模式之工厂模式工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根原创 2021-10-30 22:27:49 · 289 阅读 · 0 评论 -
工程实践:C++接口设计指北
一般来说,有两种方法设计接口类。**第一种是PIMP方法,即Pointer to Implementation**,在接口类成员中包含一个指向实现类的指针,这样可以最大限度的做到接口和实现分离的原则。**第二种方法叫Object-Interface方法**,它的思想是采用C++的动态功能,实现类继承接口类,功能接口函数定义成虚函数。原创 2021-10-30 17:41:19 · 2019 阅读 · 0 评论 -
开源代码学习:json11源码阅读
本篇是《开源代码学习》的第二篇,上一篇为:《一文搞定json解析和封装问题,手把手带你学习CJSON开源代码》本文阅读一下json11的代码,json11是使用C++11编写的json库,对json11代码或者使用感兴趣的小伙伴可以阅读一下此文。json11...原创 2021-10-14 22:04:27 · 750 阅读 · 0 评论 -
json11详细使用教程,持续更新!
jsonJSON的全称是”JavaScript ObjectNotation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。json这里就不详细介绍了,看这个链接就可json详解json11json11是用C++11编写的一个第三方库,之前在解析json数据的时候,尝试了好几个json库,最终决定使用json11,主要有以下几个原因:json的通用功能可以像使用C++类一样使用中文不乱码,这是我选择这个库的主要原因json11的gith原创 2021-10-14 22:04:12 · 2858 阅读 · 0 评论 -
Windows环境下读取文件,输出中文乱码原因剖析及解决方案!
Windows读文件中文乱码问题描述问题复现直接输出中文读文件原因分析**3.文件编码格式**解决方案问题描述这俩天,遇到了一个问题,解析json的时候,中文老是乱码。复现后,发现读取文件时,遇到中文,在控制台输出的时候也会乱码,遂进行详细分析和解决。问题复现直接输出中文//直接输出中文void test1(){ std::cout << "中文测试!" << std::endl;}直接控制台输出中文,没有毛病。读文件//读文件void test2原创 2021-10-10 16:51:40 · 3675 阅读 · 0 评论 -
Windows编程下的字符串格式及编码问题
大家在学习或者使用Windows编程中,经常会碰到字符串之间的转换,char*转LPCWSTR也是其中一个比较常见的转换。下面就列出几种比较常用的转换方法。大家可以根据自己的需求选择相对应的方法,下面来一起学习学习吧。为什么总结这个问题一些代码在其他平台下是正常的,但是在Windows环境下,经常遇到中文乱码的情况,很是头疼!1、通过MultiByteToWideChar函数转换MultiByteToWideChar函数是将多字节转换为宽字节的一个API函数,它的原型如下:int MultiByt原创 2021-10-10 16:14:32 · 612 阅读 · 0 评论 -
最好用的json库,也许是JSON for modern C++ 的最佳实践!解决nlohmann json中文无法解析的问题!
GitHub开源项的地址:https://github.com/nlohmann/jsonjson for modern c++是一个德国大牛nlohmann写的,该版本的json有以下特点:1.直观的语法。2.整个代码由一个头文件组成json.hpp,没有子项目,没有依赖关系,没有复杂的构建系统,使用起来非常方便。3.使用c++11标准编写。4.使用json 像使用STL容器一样。5.STL和json容器之间可以相互转换。如何使用?只需要带一个文件即可。#include <js.原创 2021-10-09 22:24:00 · 4704 阅读 · 6 评论 -
C++11新特性学习:auto类型推导
1.auto 类型推导在 C++11 之前的版本(C++98 和 C++ 03)中,定义变量或者声明变量之前都必须指明它的类型,比如 int、char 等;但是在一些比较灵活的语言中,比如 C#、JavaScript、PHP、Python 等,程序员在定义变量时可以不指明具体的类型,而是让编译器(或者解释器)自己去推导,这就让代码的编写更加方便。C++11 赋予 auto 关键字新的含义,使用它来做自动类型推导。也就是说,使用了 auto 关键字以后,编译器会在编译期间自动推导出变量的类型,这样我们就不原创 2021-08-09 08:26:02 · 1091 阅读 · 24 评论 -
C++最重要的知识点,学弟学妹现在搞起,进大厂必备!
很多计算机专业的大学生,在学习C++的时候,总会遇到一个问题,我该怎么学习C++,或者说该学习c++的那些内容?我整理C++最重要的一些知识点,不仅局限于书籍教材中,更多的还有一些实际开发中比较重要的地方,去年花了一个月的时间准备了这些内容,就找到了at大厂实习。内容较多,建议收藏以后慢慢看C++必备知识点1、面向对象的三大特性:封装、继承、多态2、类的访问权限:private、protected、public3、类的构造函数、析构函数、赋值函数、拷贝函数4、移动构造函数与拷贝构造函数对比5原创 2021-07-25 15:23:18 · 1729 阅读 · 34 评论 -
C++内功修炼干货,进大厂必须会的C++左值与右值,最适合小白看的文章!
左值和右值左值和右值的定义左值右值扩展左值引用和右值引用概念左值引用绑定右值右值引用绑定左值实例给右值引用传入一个左值临时变量参考资料左值和右值是C++比较重要也比较复杂的知识点,可能学习C++很久的人对这俩个概念都不是很熟悉!我在大学中对他们也是没有概念,最近学到这里,发现网上对这俩的解释也千奇百怪,所以经过三天的学习和整理,整理出一份还不错的笔记,建议大家重点看这一篇,不要被其他文章带跑偏了。左值和右值的定义在C++11中所有的值必属于左值、右值两者之一。右值又可以细分为纯右值、将亡值。在C++原创 2021-07-23 21:56:04 · 847 阅读 · 11 评论 -
这次肯定可以看懂C++智能指针,适合新手小白,C++内功修炼
智能指针的本质类。智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。为什么要使用智能指针?c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的delete语句就返回了,如果我们不在每一个可能跳转或者返回的语句前释放资源,就会造成内存泄露。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动原创 2021-07-21 23:12:16 · 1629 阅读 · 42 评论 -
学习C++不能不看的RAII机制,C++内功修炼!
RAII是C++管理资源的一种方式,可能学习C++很久的人也并不一定熟悉它,但它是十分重要的,我们的智能指针就是基于RAII设计的,所以想要真正学好C++,此类内功一定不能忽略!什么是RAII?RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。怎么做得?RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期原创 2021-07-20 22:54:09 · 736 阅读 · 11 评论 -
一文弄清using namespace std;的作用[2021最新版]
using namespace std;到底有什么用?为什么我们每次头文件后面都要加它?不加它会怎么样?导读对于很多学习C++的同学,老师教同学们写的一个程序就是“hello world”,同时也会在不经意间在头文件的后面加上using namespace std;但是却没有告诉我们为什么要这么加,所以很多同学可能现在仍然不明白他的作用。本文将详细介绍using namespace std; 帮助大家彻底理解!using namespace std;概念命名空间的定义如何访问命名空间?为什.原创 2021-06-19 13:12:38 · 45702 阅读 · 13 评论 -
一文带你彻底搞懂i++和++i的区别,谁的效率更高?
作者简介:Codebowl靓仔,学妹的工具人,C++开发误入数据开发,梦想30岁退休的靓仔就是我啦。i++和++i对于初学者来说,一直是一个特别容易搞混的内容,相信很多人现在也没有完全搞清(作者初学的时候就一直稀里糊涂的,老师在讲这个的时候也一笔带过了)。不过今天不用怕,看完这篇文章,相信你一定能搞清楚这俩个的区别!一文带你彻底搞懂i++和++i的区别,谁的效率更高?基本概念++i和i++的区别i++和++i的原理单独使用时参与运算时i++和++i那个效率更高?基本概念两者的作用都是自增加1。.原创 2021-06-12 13:41:51 · 28895 阅读 · 27 评论 -
C++文件操作详解,实用文件辅助类源码分享,建议收藏自用!
学习C++的小伙伴,应该会经常遇见对文件进行操作的需求,例如读写文件,作为一个使用频率较高的操作,我们每次重复地编写代码,就是浪费劳动力了,所以作者将自己常用的文件操作封装成了一个类,需要的小伙伴自取哦。文末附源码,可直接使用。使用的文件操作函数为C标准库文件操作功能实现详解打开文件fopen参数说明关闭文件刷新文件读文件读文件字符串写文件获得文件大小其他操作源码小结功能实现详解打开文件对文件进行读写操作的第一步就是打开文件。该函数使用说明参数1:文件名参数2:打开模式返回值:BOOL原创 2021-06-09 10:19:30 · 1732 阅读 · 48 评论