【高质量C++/C总结8】内存管理——指针参数传递内存

C++/Qt高薪项目实战:工业级应用开发核心技术解析 C++作为高性能系统编程语言,凭借其零成本抽象和底层硬件控制能力,在需要极致性能的领域占据核心地位。其内存管理、模板元编程等特性使开发者能够构建高效、稳定的复杂系统。Qt框架则提供了强大的跨平台GUI开发能力,通过信号槽机制、模型/视图架构等设计,极大地提升了桌面和嵌入式应用的开发效率。两者的结合在工业自动化、汽车电子、医疗器械等高壁垒行业展现出巨大技术价值,能够满足复杂业务逻辑、高性能计算和严苛稳定性要求。本文以工业监控系统为例,深入剖析如何运用现代C++特性与Qt框架精髓,解决多线程数据同步、实时可视化 阅读详情

说在开始:

我提炼了《C++ Primer》、《侯捷C++》、《高质量程序设计指南——C/C++语言》等资料中的重要部分,并总结成此博文。其中涉及到许多我个人对C++的理解,如若有不合理之处,还请朋友们多多指出,我会虚心接受每一个建议。

作者:尹豆(憨豆酒),联系我yindou97@163.com,熟悉图形学,图像处理领域,本章代码: https://github.com/douysu/computer-graphics-notes

使用函数参数动态申请内存时易出现的问题

这里讲解一下网上常出现的GetMemory()方法,经常被作为考察C++功力的面试题。

//错误代码
void GetMemory(char *p) {
	p = (char*)malloc(sizeof(char) * 100);
}
int main() 
{
	char *str = NULL;
	GetMemory(str);
	strcpy_s(str,100, "Hello world ");//运行错误
	cout << str << endl;
	cin.get();
}

如上面的错误代码,在函数的参数为指针时,千万别使用该指针去申请动态内存。为什么会出现这个问题呢?

这就形参_p和实参p的问题了。编译器会对函数每个参数拷贝一个副本,也就是_p。这里是形参_p指向了新申请的动态内存,而实参p并没有指向内存,在方法GetMemory执行结束后,_p自动销毁,那么申请的内存就变成了垃圾内存,每运行一次GetMemory,就会泄漏一块内存。所以上面的代码是错误的。

可以改写成指针的指针来动态申请,如下。

//正确代码方式1——指针的指针
void GetMemory2(char **p) {
	*p = (char*)malloc(sizeof(char) * 100);
}
int main() 
{
	char *str = NULL;
	GetMemory2(&str);
	strcpy_s(str,100, "Hello world ");
	cout << str << endl;
	cin.get();
}

指针的指针有时理解起来会有困难,建议大家使用此种方案。

//正确方式2——返回值
char* GetMemory3() {
	char* p = (char*)malloc(sizeof(char) * 100);
	return p;
}
int main()
{
	char *str = NULL;
	str=GetMemory3();
	strcpy_s(str, 100, "Hello world ");
	cout << str << endl;
	cin.get();
}                                                                                                  ```

这里需要注意,千万不要在GetMemory方法中返回栈内存的内容。例如:

//错误示例
char* GetMemory() {
char[] p=“Hello”;
return p;
}
//存在问题的示例
char* GetMemory() {
char* p=“Hello”;
return p;
}


在第一个方法中字符数组在栈中,方法执行完后,自动释放,返回指针和引用都是无意义的。

第二个方法可以正确运行,但是不建议这样做。因为这里的Hello是一个常量字符串,在静态存储区,在程序生命期内始终存在,无论什么时候,返回的都是同一块内存的内容,最好不要修改该内存的内容,可以使用const进行修饰防止出现修改错误。
AI辅助C++学习路线:从基础语法到项目实践的十周入门指南 C++作为一门高性能的系统级编程语言,其核心价值在于对内存和硬件的精细控制能力,广泛应用于操作系统、游戏引擎和高频交易等关键领域。理解C++编程的本质,需要从程序编译运行的基本原理入手,掌握变量、函数、内存管理等基础概念。通过结合现代AI工具(如代码生成和调试辅助),学习者可以优化学习路径,实现高频实践与即时反馈。本文聚焦于C++基础入门,提供一条从环境搭建、语法核心到面向对象和标准库的十周学习路线,帮助初学者快速建立可实践的知识体系,并自然融入智能指针、内存管理等关键热词,最终通过项目实践巩固技能。 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第二十四篇 编译器04 LLVM编译器02

B-WUCL(用户权重均匀对比损失)和D-WUCL(物品权重均匀对比损失)中,动态调整参数λ_new(新用户补偿因子)和α(长尾补偿强度)是优化推荐系统适应数据分布变化的核心。

weixin_49199313的博客 1242

指针进阶:深度解析C语言中的内存操作艺术

指针,作为C语言的核心特性之一,是理解和运用C语言的关键所在。指针不仅能让程序员更直接地操作内存,还能优化数据结构,提高程序效率。本文将从多个方面深入探讨C语言中的指针,并辅以代码示例,旨在帮助读者深入理解和灵活运用指针。指针是C语言中一个非常强大且复杂的特性,它允许程序员直接操作内存地址,实现高效的数据结构和算法。通过掌握指针的使用,可以更加深入地理解计算机内存的工作原理,并编写出更加高效和灵活的程序。

2301_80817679的博客 1320

YOLOV8主干改进方法:C2f-Dual——DualConv轻量化双卷积设计(附改进代码)

DualConv是一种创新的卷积网络结构,旨在构建轻量级的深度神经网络。它通过结合3×3和1×1的卷积核处理相同的输入特征映射通道,优化了信息处理和特征提取。DualConv利用组卷积技术高效排列卷积滤波器,大大降低了计算成本和参数数量。

m0_74890428的博客 4698

c语言中哪些指针指向的内存可以修改,【C语言】基础(九)指针

·指针指针:指针就是地址指针变量:存放变量地址的变量使用指针的目的:要通过指针能够找到被指的变量,或者说要通过指针间接访问被指的变量取变量;栈区int *p 指向int类型的指针%p 输出指针&取址符初始化int *p=NULL; 必须初始化定义时放*(*p=&a),赋值时不能放(p=&a )* 类型说明的作用间接访问指针指向内存的值的作用p=&a; 打印:p为地址...

weixin_39655085的博客 1306

AD9361 FIR 滤波器设计

matlab 得到滤波器系数

weixin_44630490的博客 1万+

Unity 常见问题 之 打包编译的报错 Unable to sign the application; please provide passwords!

Unity 常见问题 之 打包编译的报错 Unable to sign the application; please provide passwords! 目录 Unity 常见问题 之 打包编译的报错 Unable to sign the application; please provide passwords! 一、简单介绍 二、问题描述 三、原因分析 四、可能的解决方法 方法一:取消 Keystore 设置即可 方法二:重新添加 Keystore 相关设置 一...

仙魁XAN 1万+

(十二)内存管理和指针

内存管理和指针使用

qq_32076957的博客 585

VMwareWorkstation安装UOS系统(1070版本)教程

UOS系统是一款国产信创操作系统。目前市面上主流的系统版本是1070,下面我们用虚拟机来安装一下这款系统。

欲买桂花同载酒的博客 4291

郝斌C语言_指针 ;字符串 ;动态内存分配 ; 结构体(笔记)

郝斌 ; C语言 ; 指针 ; 笔记

BEST_ME_的博客 643

彻底解决0x80070005错误代码:全面分析与实战指南

0x80070005错误代码虽然令人头疼,但通过上述方法,我们完全有能力将其攻克。从检查磁盘空间、设置账号权限,到运行疑难解答和系统文件检查器,再到调整相关服务状态,每一步都是解决这一问题的关键。希望本文能为你提供有力的帮助,让你在使用Windows系统的过程中更加顺畅无忧。

nntxthml的博客 6933

可编程逻辑控制器(PLC)系列:Mitsubishi MELSEC-Q_(8).MELSEC-Q系列PLC故障诊断与维护

MELSEC-Q系列PLC的故障诊断与维护是一个系统性的过程,需要工程师具备扎实的理论基础和丰富的实践经验。通过了解故障类型、使用诊断工具、遵循诊断步骤,可以有效地定位和解决故障问题。同时,定期的检查与保养、备份与恢复、优化程序和配置,以及提供良好的运行环境,可以减少故障的发生,提高系统的可靠性。希望本文能够帮助工程师在故障诊断与维护过程中更加得心应手,确保MELSEC-Q系列PLC的稳定运行。

2401_87715305的博客 1247

指针以及内存分配

1. 指针很灵活,这使得指针很难管理,在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放),指针的地址内存只是存放指针的地址,不存放指针指向的数据,值得注意的是,定义指针时指针会随机指向一块内存,如int  *p;p会指向一块不为空的内存,相当危险,例如执行判断if(!p){ printf("p为空");};这里不会输出"p为空";所以在定义时想让指针p为空,则要int 

bizhu的专栏 1万+

3、固定翼无人机模型解析

本文详细解析了固定翼无人机的动力学模型与纵向模型,涵盖位置、速度、角度及角速度的变化率方程,并介绍了力和力矩的计算方法以及气动系数的表达式。通过关键参数分析,探讨了速度、迎角和倾斜角对飞行性能的影响。文章还展示了模型在编队飞行和任务规划中的应用,并提出了参数优化与先进控制策略等优化思路,为无人机飞行控制系统设计提供了理论基础。

gaochao的博客 240

内存管理_高质量C++/C编程指南

内存管理

qq_51556066的博客 164

MATLAB 基于 Baker 映射和 Logistic 混沌序列的图像加解密实现

图像加密是信息安全领域的重要研究方向,在数字版权保护、隐私保护等领域有着广泛应用。本文将介绍基于 MATLAB 的 Baker 映射和 Logistic 混沌序列的图像加解密算法,该算法利用混沌系统的初值敏感性和伪随机性,能够有效地对图像进行加密和解密。基于 Baker 映射和 Logistic 混沌序列的图像加解密算法是一种有效的方法,可以应用于数字版权保护、隐私保护等领域。MATLAB 提供了强大的工具和函数,可以方便地实现该算法。

走向CTO的路上... 934

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

《高质量C++/C编程指南》读书笔记之二

第六章 1. 2.值传递,地址传递,引用传递(C++中增加的) 3.return语句不可返回指向“栈内存”的指针或“引用”,因为该内存在函数体结束时被自动销毁。 4.函数的功能要单一,不要设计多用途函数。 5.建议尽量少用static局部变量。 6.不仅要检查输入参数的有效性,还要检查通过其它途径进入函数体内的变量的有效性。例如全局变量,句柄等。 关于函数相关的操作,是比较深奥的,对

hgj125073的专栏 676

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Visual C++/CLI实战指南:混合编程与互操作核心技术解析

在软件开发中,混合编程技术是实现不同技术栈互操作的关键手段,它允许开发者在同一项目中整合多种编程语言和运行时环境。其核心原理是通过特定的语言扩展和运行时桥接机制,在托管代码(如.NET)与非托管代码(如原生C++)之间建立安全、高效的数据与调用通道。这项技术的核心价值在于能够复用经过长期优化的遗留代码库,同时利用现代开发框架的高效生产力,有效降低系统重构的风险与成本。在应用场景上,它广泛适用于企业级应用集成、高性能计算组件封装、硬件驱动接口包装以及系统级工具开发等领域。本文聚焦于Visual C++/CLI

weixin_30879833的博客 747

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

高质量C++/C编程学习笔记(四)----- 内存管理(2)

5、用指针参数传递内存 用指针作为函数的参数,如果去申请动态内存的话,是不会成功的。 void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(str, 100);...

凌云壮志 134

c++高质量编程手册

怡化主管强烈要求我读这本书。。。。 笔记尚未完成,持续更新呗。。 第1章 高质量软件开发之道 1.1 软件质量基本概念 1.1.1 如何理解软件的质量;功能性和非公能性 1.1.2 提高软件质量的基本方法; 一次性编出高质量的程序 1.1.3 “零缺陷”理念 1.2 细说软件质量属性 1.2.1 正确性; 需求范围内的需求 1.2.2 健壮性 需求外的扩展需求 1容错 ...

weixin_33976072的博客 292

C语言零基础入门到精通:B站最全教程学习路线与实战指南

C语言作为计算机编程的基石,其核心价值在于帮助开发者深入理解计算机底层原理,如内存管理、指针操作和数据结构。通过系统学习C语言,学习者不仅能掌握结构化编程思想,还能为后续学习操作系统、嵌入式开发等高级领域打下坚实基础。本教程以零基础学习者为目标,提供从环境搭建、基础语法到指针、文件操作等进阶主题的完整学习路径,并结合项目实战,帮助学习者通过动手实践巩固理论知识。教程内容覆盖了C语言的核心知识点,如变量、函数、数组、指针和结构体,并强调通过实际编码和调试来提升编程能力。对于希望入门编程或深化计算机基础的学习者

weixin_30294295的博客 330

高质量C++程序设计学习笔记

<br /> <br /><br />1.“你使用一个语言特征是因为你需要它,而不是因为它存在”,学习一门程序设计语言,并不需要掌握其全部的语法,关键是要学习使用语言来解决实际问题的方法。如果你掌握的语法和程序设计方法能够高效地解决实际工作中的问题,那么表明你已经掌握了这门语言。<br />2.C++标准定义了标准库的接口,但未实现,这是语言实现的任务。编程语言的实现就是编译器,连接器或者解释器。语言实现有多重不同的版本,在符合标准的情况下,可以适当扩展,但一般都实现了标准化库,而且接口保持一致。<br /

zjmdp的专栏 1175

SWIG实现C++与C#跨语言互操作:核心问题与实战解决方案

跨语言互操作是软件工程中连接不同技术栈的关键技术,它允许开发者在一种编程语言中调用另一种语言编写的代码,从而复用现有库和模块。其原理通常基于中间层或包装器,在运行时或编译时处理数据类型转换、内存管理和函数调用约定。这项技术的核心价值在于打破语言壁垒,最大化利用各语言生态优势,例如将C++的高性能计算库与C#的快速应用开发能力相结合。在实际应用场景中,游戏开发、科学计算和高频交易系统常需要此类集成。本文聚焦于使用SWIG工具解决C++与C#互操作时的典型挑战,特别是针对**内存管理**和**数据类型映射**这

keke1314520的博客 453

C++面试错题集:从概念到实战的避坑指南

在C++编程领域,内存管理和多态机制是构建高效、稳定软件系统的核心基础。内存管理涉及栈与堆的生命周期、智能指针的引用计数原理,理解这些概念能有效避免野指针和内存泄漏问题。多态机制通过虚函数表和虚函数指针实现动态绑定,掌握对象构造析构顺序和override关键字的使用,是设计可扩展面向对象系统的关键。这些技术不仅提升了代码的健壮性和性能,更在嵌入式系统、游戏引擎、高频交易等对资源控制和实时性要求极高的场景中体现价值。本文围绕C++面试中的高频易错点,结合C++八股文和嵌入式面试等热点,深入剖析内存管理、多态、

weixin_33834628的博客 307

指针对内存的地址管理

当今内存大多分为4G,8G,16G等,对于仅仅以字节的数据存放,是一个过于宽阔的区域。这样就会类似与生活中的大型快递存放点,你有一个亏快递,但是你却并没有取件码,这可就是类似与大海捞针,就算找到也会花费大量的时间,是一个非常低效率的行为。这对于具有极快计算速率的CPU是完全行不通的,于是更加需要的就是类似与快递柜号,这样才会更加具有效率。(此文以Visual Studio 2019为例)

weixin_64609308的博客 918

C++进阶与拔高(九)(C++内存管理)(智能指针与内存泄漏)

第四章 C++内存管理        C++内存管理几乎存在于程序设计的方方面面,内存泄漏在每个C++程序中都有可能发生。参考网上大佬的博客,我们在这章对C++内存管理有一个大致的认识。本章包括内存管理,内存泄漏以及内存回收。C++测试岗位和开放岗位的面试很看重这一部分,因此很有必要说一下。本章讲解的内容均来自于博客:        http://cnblogs.com/qiubole/arc...

Lao_tan的博客 2743
上一篇: 【高质量C++/C总结7】内存管理——常见的内存错误及对策
下一篇: 【高质量C++/C总结10】C++实践细节总结10
尹豆(douysu)
博客等级 码龄9年 151粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值