聊聊我对c/c++的认识

c 释放两次内存_从缺陷中学习C/C++:聊聊 C++ 中常见的内存问题 在写C/C++程序时,一提到内存,大多数人会想到内存泄露。内存泄露是一个令人头疼的问题,尤其在开发大的软件系统时。一个经典的现象是,系统运行了10天、1个月都好好的,忽然有一天宕机了:OOM(Out Of Memory,内存用光)!于是,痛苦地查找内存泄露根源的过程开始了…本拿主要讨论内存使用问题,包括内存泄露、悬挂指针、内存重复申请、变量的作用范围等,涉及指针、数组、引用等的使用。6.1数组越界... 阅读详情

聊聊我对c/c++的认识


/******************************************************************
*本文首发于bbs.bluegem.org的CWorld区
*本人email:chenfei@sohu.com
*如转载本文,请保留首发地和本人联络方式,以方便交流,谢谢!
******************************************************************/


首先:c和c++完全是两种不同的语言,虽然c++有时候看起来很像c。他们最主要的差别在于编程的思想。
无论c还是c++都不完全是高级语言,他们很大程度上与平台有紧密地联系。这里的“平台”即可能指不同的硬件平台,比如x86、powerpc、spar或者64位的amdOpteron;也指特定的软件平台,通用的有linux、win32,非通用的比如某块语音卡、ibm的MQ。所以学习c/c++就要把握两方面的知识,与平台无关或者说c/c++语言本身的特性和与平台相关的特性。

下面就先说说与平台无关的知识。
1、语法。这个基本上没什么可讲的。熟练掌握最常用的,知道什么地方是雷区,注意一些细节问题,比如sizeof()在不同context中的结果、函数的形参和实参、类的拷贝构造函数等。
2、标准库。无论c还是c++,语言本身都提供了强大的标准库,比如string、errno、time尤其是c++中的stl等。对标准库的熟悉可以让我们的编程工作少走弯路,而且标准库的实现是最高效最稳定的。我想微软的msdn是最好的电子文档之一。
3、编程规范或者说习惯。这是一名合格的程序员的必要条件,也是从学生程序员蜕变为职业程序员的重要标志。想在这方面提高的朋友可以参考林锐博士的《高质量C++_C编程指南》、网文《编程修养》等,最好的办法当然是进入一家管理正规的公司接受正规培训。其实编程规范没必要墨守成规,不同的单位甚至不同的项目对规范的要求都不一样,能把程序写清楚,代码稳定、易读、易维护、专业并且符合单位的相关规定就可以了。
4、编程的工程管理。编程规范是针对个人的,而工程管理则是针对负责项目的所有程序员。工程管理首先强调的是接受管理的能力,如果上级交付的任务都不能按要求完成,那就……其次个人是否能把自己负责的模块管理得很科学,比如项目文件的安排(这方面win32的程序员要幸运的多,无论vc还是bcb都已经把项目的管理做得很好了,而大部分的*nix程序员,要自己来做这部分工作),还有函数的功能划分设计等。这些都是小规模的项目管理实践。一些既有天赋又勤奋努力的程序员会逐步走成长为项目组长直至cto,负责项目整体的管理。具体的管理方法很多,比如学院派的cmm等。再说大点,项目达到一定规模后,狭义的软件工程已经无法适应项目管理的需求,程序员要求助于传统工程的一些管理思想和手段。
5、编程思想。编程思想工程的指导思想,好比伟大的毛泽东思想之于中国革命实践。c/c++的编程思想存在很大差异。c强调面向过程理论,c++强调面向对象理论。随着技术进步面向过程理论不能满足时代的需要,主要体现在大项目上,使用纯粹面向过程的方法进行开发,程序员往往陷入如何实现前人已经实现的功能,尤其设计gui部分,很难把精力集中于业务逻辑;而且代码纷乱,难以实施有效的维护和二次开发。面向对象理论解决了这一问题,但这并不意味着面向过程理论被淘汰了,任何面向对象的语言在具体功能模块实现时依然使用面向过程的三板斧:顺序、条件选择和循环。从这个角度看面向过程不但没有弱化,反而比以前更重要了。面向对象编程的核心目的就是复用,把经常做的一些工作封装好,让程序员把精力集中于业务逻辑。c++的编程思想中还有个重要特性:范型编程,比如stl。请注意,stl并不是面向对象的产物。
其实能真正把面向过程的c做好的人也不是很多,能在c++方面造诣很深的人就更少了,至少我就不是:(。很多时候我们写的程序只能称为“基于对象”的。

再说说与平台相关的知识。
1、系统级的数据类型和api。先说数据类型,很古老的例子,16位机器和32位机器的int字长分别是两字节和四字节。再说数据类型,ms在标准数据类型的基础上又定义了N多数据类型,写过vc的人恐怕是深受其害。看那些linux跨操作系统平台的软件源代码也会发现无数的#ifdef....。系统级的api一般都是c的接口,win32有sdk、directX等,典型函数有winmain()、SendMessage();linux的glibc,典型函数有setuid()、tmpfile()。
2、非通用平台的数据类型和api。还有一些特定的软硬件环境也提供特定的数据类型和api,比如加密卡、数据传输卡提供的驱动;ibm的mq(mq就提供c和c++两套接口api)。
3、不同的类库。用c++工作在不同的平台下要熟悉相关类库,比如ms的mfc,跨平台的通用库有boost,我还曾经用过一个加/解密算法库crypto++(crypto++也提供c和c++两套接口api)。学会重用前人的代码也是一门功夫。
开发总是在特定平台下进行的,所以熟悉至少一个系统级的api或者类库是必须的。根据工作中不同的侧重和项目的要求还要熟悉一些特定的库。比如我原来经常用到一些加解密算法,我就必须对crypto++非常熟悉。另外,熟悉和使用一些公共用途的库比如boost,对开发工作有事半功倍的效果。
4、了解程序编译、连接的过程。库的静态链接、动态链接以及库的动态载入和卸载。项目做大了,自然不能一个可执行文件就把全部问题都解决了。ms平台下的程序员请参考msdn,linux程序员可以参考《advanced-linux-programming》
5、无论在何种平台下工作至少要熟悉一种开发调试工具。windows程序员很幸福,ms提供了集成开发环境visual c++(.net),borland提供了bcb;传统linux程序员一般使用gcc和gdb,目前linux下也有很多集成开发环境,大大方便了开发工作。


以上这些不太可能几天内全部看完,需要在工作中逐步提高。最初还是把注意力放在语法、规范和标准库方面,把基础打扎实为宜。随着工作经验的增加,在工程中会逐步处于主导地位,负责一些整体设计的工作。这时再做项目,就要有意识的运用面向过程或者对象的理论进行设计,制定符合自己项目的代码规范。在动手前仔细想想可能用到哪些功能模块,有没有可能复用前人的代码,这些被复用的代码正确性和效率是不是符合自己的要求?
孔子说学而不思则罔,做完项目后休息调整一段时间,再从设计到具体编码重新审视一边,会有很多心得。平时经常看看标准库和系统的库,多熟悉公共用途的库比如boost,有备无患。除了刚才提到得这些具体实现技术外,如果能高屋建瓴地看些编程思想方面的知识则更好,提高内功,比如《thinking in c++》《设计模式》等都是很好的学习材料。
现在有很多公开源码的优秀项目,阅读这些项目的代码,找出其中的bug并与作者进行交流,也是提高技术水平的重要途径。
在某些大项目中,有可能给别人提供api编程接口,接口的定义需要双方协商制定,风格尽量向标准库或者mfc、boost这样的专业库靠拢。

这篇文章当中讲的都是传统的编程,随着时代的发展出现很多新技术,比如以java和.net为代表的n层结构(可以参考我的另一篇文章《我的Java之路一》);还有activX、COM、CORBA,基本都是围绕internet展开的,初衷是跨平台,最核心的目的依然是复用。了解掌握这些技术,既是增加了自己一门专业技能,对加深传统编程的理解也非常有好处。

 

Windows11安装Ubuntu 20.04.3 LTS双系统(详细过程) 一、基础环境 听说BIOS模式的传统MBR模式和新式UEFI模式,会对安装双系统产生影响。Windows11应该都是UEFI吧,可以按win+r输入msinfo32回车确认查看BIOS模式,我的电脑是UEFI+双硬盘 Ubuntu安装准备 1、 官网下载Ubuntu 20.04.3 LTS镜像iso文件:https://ubuntu.com/download/desktop 2、 下载官网推荐的U盘启动制作工具rufus: https://rufus.ie/ 3、制作启动u盘 插入U盘, 运行 rufu 阅读详情

相关推荐

忍者安全渗透系统(NINJITSU OS V3)的安装详细过程,亲测新旧vm版本都可安装,附带下载来源

忍者安全渗透系统(NINJITSU)的安装详细过程,亲测新旧vm版本都可安装,附带下载来源

1万+

C++介绍与入门学习

C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。 C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。 免费教程链接:C++ 入门教程(开发文档) 语言特点: 支持数据封装和数据隐藏 在C++中,类是支持数据封装的工具,对象则是数据封装

C语言C++学习俱乐部:765860056 477

施耐德 Modicon M580 ePAC 项目实战:从硬件选型到 Control Expert V15 组态

本文详细解析了施耐德 Modicon M580 ePAC 在工业自动化项目中的实战应用,从硬件选型到 Control Expert V15 组态的全流程。重点介绍了水处理站控制系统的硬件配置、网络架构设计、软件安装授权及程序框架开发,帮助工程师高效实施中大型控制系统项目。

weixin_33701617的博客 326

C++的认识

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_57916989的博客 1315

GT-suite v2016的下载和安装

1 写在前面 GT-suite 是一款用来做内燃机仿真的软件。在安装过程中遇到很多问题,网上的安装教程也大都抄来抄去,试着安装了几遍都没有成功。最终在贴吧一个老哥的帖子里找到了解决办法,但是老哥的帖子也不是很详细,所以做了这个详细版本的教程。 GT-suite v2016安装包: 链接:https://pan.baidu.com/s/1JZPgJ8_-J-L8rV84-eHedQ 提取码:uj...

kisssshot的博客 3万+

MOOS-ivp 实验三 MOOS简介(3)

MOOS-ivp 实验三 MOOS简介(3) 继上一篇文章继续对实验进行记录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录MOOS-ivp 实验三 MOOS简介(3)六、A Simple Example with pXRelay1.pXRelay基本使用2.pXRelay简单例子3.pXRelay实验七、First Experiments in Modifying MOOS App Code1.下载一个MOOS模板文件2.打开MOOS模板文件总结 六、A Simple E

weixin_44151170的博客 2534

走进C++——1.C++的初步认识

走进C++——1.C++的初步认识

jinboxin_的博客 1219

ComfyUI安装包运行前准备:增加虚拟内存

在Windows系统中,虚拟内存是一种重要的系统资源管理机制,它主要通过将硬盘空间用作内存来扩展系统的可用内存容量。以下是虚拟内存的主要作用: 1. 扩展物理内存容量 当物理内存(RAM)不足时,系统会将一部分数据从内存转移到硬盘上的虚拟内存区域(也称为“分页文件”或“交换文件”)。这样可以为正在运行的程序提供额外的“内存空间”,确保系统能够继续运行,而不会因为内存不足而崩溃。 2. 提高系统稳定性 虚拟内存为系统提供了一个缓冲区。如果没有虚拟内存...

聚梦小课堂 1万+

C++ 认识和了解C++

C语言和C++的区别 struct 在C和C++中的区别 struct和class的区别 三种变量类型:值类型,指针类型,引用类型 野指针不是NULL指针,是指向垃圾内存的指针 函数重载---重载多态

NuYoaH502329的博客 499

有限元缺陷:剪切锁死

有限元缺陷:剪切锁死

wsxww11的博客 5187

ABB机器人与S7-1200PLC实现位置坐标数据发送和接收的具体方法

ABB机器人与S7-1200PLC实现位置坐标数据发送和接收的具体方法

Robot_PLC_HMI_Automation 2916

Qt专家、订阅号“程序视界”创建者安晓辉:引导你逐步深入学习C++

作者简介:安晓辉,程序员、技术管理者、作家、职业规划师、在行行家、分答答主,著有《Qt on Android 核心编程》、《Qt Quick核心编程》和《你好哇,程序员》,创建订阅号“程序视界”。 C++是一门古老而复杂的语言,绝不是一门可以速成的语言,学习它需要有意识的刻意练习和长时间的持续不断的磨练。而大多数人不太能耐得住寂寞,喜欢速成,所以像《21天学通C++》这种书就比较受欢迎,卖得...

小秋博客 1025

基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行

基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行

1902

聊聊我对c/c++的认识 [转]

聊聊我对c/c++的认识/*******************************************************************本文首发于bbs.bluegem.org的CWorld区*本人email:chenfei@sohu.com*如转载本文,请保留首发地和本人联络方式,以方便交流,谢谢!*************************************

听风的专栏 1236

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

聊聊C/C++要过的桥

学C还是C++少年你要明白,你无法学到正宗C++的哟,C++的优秀对C反产生了影响,所以C的很多规则已经和C++搞成一体了。 反正就是:基本语句是一样的,再学个类不就是C++了吗? 你还是学

KD的疯狂实验室 535

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

聊聊关于C/C++调试的看法

Contentsdebug 是什么debug 的步骤debug 分类debug 调试跟踪工具静态分析工具性能调试工具 Linux 环境下的 C/C++ debug。 在 Windows 环境下开发由很多优秀的 IDE 可以使用,而在 Linux 下开发C/C++,最好的开发环境并不是 IDE,而是一系列工具的组合。不要执着于争论到底是 ide 齐全还是 vim/emacs 效率高,只要用惯、用熟...

_IronMan's 博客 588

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C/C++ 聊聊结构体、指针、类

QT可以调用很多第三方的C、C++库,了解一些基础知识是有必要的。C++能兼容大部分C的特性,有些是基于设计的考虑不兼容。提“兼容”只是为了指出可察的“延续性”,不深入“兼容”这个话题。本篇侧重QT开发者的角度去理解,指针和结构体的知识是为类进行铺垫,主要是方便QT开发者阅读,对于C开发者来说,也仅是基础知识。

ocy的博客 768

作为一个Linux/C/C++开发工程师,聊聊对Python的看法

​首发:公众号【编程珠玑】 作者:守望先生 前言 首先说明,这不是软文。仅仅是个人看法,同时也会仍然坚持C/C++,毕竟要吃饭。 近年来以及最近想必大家总能看到Python的身影, 有的是频繁报道Python制霸编程语言排行榜,有的是总能看到各种Python的培训课程,作为主要使用其他语言的你,恐怕心里很难不会有悸动。那么应该如何看待Python? 说说排行榜 TIOBE 编程...

守望的博客-编程珠玑 2709

简单聊聊C/C++中的左值和右值

为什么标题要写成简单聊聊,而不是写成什么“C++中左值与右值详解”或者现在很流行的“惊了!看了这一篇左值与右值讲解,他吊打了面试官”,其实带有详解这个词是需要勇气的,最起码要融会贯通之后才敢这么说吧,本来是学习右值引用的,结果涉及到了左值和右值,然后去了解他们历史发现也是有些混乱,操作中又经常涉及到运算符优先级,真是越学越乱了...

AlbertS Home of Technology 6168

c++需要学几年_作为一个C/C++工程师,聊聊对Python的看法

本文授权转载来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng前言首先说明,这不是软文。仅仅是个人看法,同时也会仍然坚持C/C++,毕竟要吃饭。近年来以及最近想必大家总能看到Python的身影,有的是频繁报道Python制霸编程语言排行榜,有的是总能看到各种Python的培训课程,作为主要使用其他语言的你,恐怕心里很难不会有悸动。那么应该如何看待Python?...

weixin_39769187的博客 385

c char转int_从缺陷中学习C/C++:聊聊 C++ 中常见的内存问题

在写C/C++程序时,一提到内存,大多数人会想到内存泄露。内存泄露是一个令人头疼的问题,尤其在开发大的软件系统时。一个经典的现象是,系统运行了10天、1个月都好好的,忽然有一天宕机了:OOM(Out Of Memory,内存用光)!于是,痛苦地查找内存泄露根源的过程开始了…本拿主要讨论内存使用问题,包括内存泄露、悬挂指针、内存重复申请、变量的作用范围等,涉及指针、数组、引用等的使用。6.1数组越界...

weixin_39682673的博客 298

c/c++ rs485通信_聊聊你知道的RS485接口

文 / EdwardTTL串口TTL串口是我们日常做电子产品调试时候常用的一种通讯口,你可以用它来控制外设芯片,可以用它来做调试输出。之所以TTL串口这么受大众欢迎,是因为在硬件层面,它连接简单,只需要RXD、TXD和GND三根线即可连接两台机器进行通讯,而且通讯方向全双工。软件层面,TTL串口没有复杂的协议栈,软件处理非常简单。但是,5V电平的TTL串口显然无法做长距离的通讯,因为串行通讯在较长...

weixin_39716703的博客 1516

从一次memcpy崩溃聊聊C/C++内存操作的‘潜规则’与安全实践

本文通过一个memcpy引发的崩溃案例,深入探讨了C/C++内存操作的潜在风险与安全实践。文章剖析了内存越界等常见问题,并提供了现代C++的安全替代方案及性能与安全的平衡策略,帮助开发者避免内存操作中的陷阱。

weixin_30530939的博客 258

从一次memcpy访问冲突,聊聊C/C++内存操作的‘边界感’养成

本文通过一个memcpy访问冲突的案例,深入探讨了C/C++内存操作中的边界管理问题。文章分析了越界访问的风险,对比了常见内存操作函数的特点,并提出了构建内存安全意识的三个关键维度和防御性编程策略,帮助开发者养成对数据边界的敏锐直觉。

weixin_42526353的博客 197

别再让SIGPIPE信号搞崩你的C/C++网络程序了:聊聊send()里的MSG_NOSIGNAL到底怎么用

本文深入探讨了C/C++网络编程中SIGPIPE信号的危害及解决方案,重点介绍了send()函数中MSG_NOSIGNAL标志的使用方法。通过实际代码示例和性能对比,展示了如何避免因客户端异常断开导致的进程崩溃,提升网络程序的健壮性。文章还涵盖了多线程环境下的防御策略和跨平台兼容性处理,帮助开发者构建更稳定的网络服务。

weixin_33736649的博客 311

从C语言到C++:聊聊Autosar CP/AP开发语言切换背后的那些‘坑’与最佳实践

本文深入探讨了从C语言到C++的Autosar CP/AP开发语言切换过程中的关键挑战与最佳实践。针对嵌入式开发者常见的‘坑’,如内存管理、面向对象范式、通信机制重构等,提供了实战避坑指南和性能优化方案,帮助团队高效完成技术转型。

weixin_33696106的博客 162
上一篇: 华为面试归来——够呛
下一篇: C++中内存块置0的三种方法:memset, ZeroMemory和SecurZeroMemory
chenfei
博客等级 码龄25年 12粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值