【高质量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

无线图像传输新突破:深度JSCC算法在低带宽环境下的性能实测

本文深入探讨了基于深度学习的信源信道联合编码(JSCC)算法在低带宽无线图像传输中的突破性表现。通过实测数据对比,深度JSCC在低信噪比环境下展现出卓越的鲁棒性,有效对抗传统方案的“悬崖效应”,实现图像质量的平滑下降,为远程医疗、工业巡检等严苛场景提供了新的解决方案。

weixin_29090089的博客 504

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

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

weixin_39655085的博客 1306

AI算力瓶颈与系统优化实战指南

AI算力瓶颈已成为制约人工智能发展的关键因素,特别是在处理transformer类模型时,传统的冯·诺依曼架构面临严重的'内存墙'问题。通过硬件加速、系统优化和算法改进的三级策略,可以有效提升资源利用率。在嵌入式AI领域,结合量化、剪枝和专用指令集扩展等技术,能在资源受限设备上实现高效推理。这些优化方法在自动驾驶、工业视觉等场景中已展现出显著价值,推动AI应用从云端向边缘迁移。随着AI算力需求的持续增长,掌握系统优化技能将成为开发者的核心竞争力。

weixin_32597009的博客 339

保姆级教程:用Python+NumPy手把手模拟光学散射与记忆效应(附代码)

本文提供了一份详细的Python+NumPy教程,手把手教你模拟光学散射与记忆效应。从基础光波建模到散射介质实现,再到菲涅尔衍射和光学记忆效应验证,逐步构建完整的仿真系统。通过附带的代码示例,读者可以快速掌握计算光学仿真的核心技术,为医学成像、物理仿真等领域的研究提供实用工具。

weixin_30172941的博客 324

(十二)内存管理和指针

内存管理和指针使用

qq_32076957的博客 585

【漏洞复现】用友NC-Cloud-反序列化-ResourceManagerServlet

NC Cloud是用友公司推出的大型企业数字化平台。支持公有云、混合云、专属云的灵活部署模式。NC Cloud完全基于云原生架构,技术先进、性能稳定、自主安全可控,支撑大中型以及超大型集团企业N层多site混合云部署方案,支持整个系统高可用、弹性扩展、双/多活,以及快速灾备恢复能力等。用友-NC-Cloud ResourceManagerServlet 接口存在反序列化漏洞,使得攻击者可以通过构造特定的请求远程执行恶意代码。此漏洞可能导致攻击者获取系统权限、执行任意命令,严重威胁系统的机密性和完整性。

漏洞复现 1365

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

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

BEST_ME_的博客 643

ESP32 DW1000 UWB 室内定位系统

详细介绍ESP32 DW1000 UWB 室内定位系统的设计演示demo。

DT程序员的博客 1662

uniapp 如何封装实现任意页面都能使用的全局弹窗

项目内容场景全局监听消息提示难点uniapp 无法全局挂载组件解决方案动态创建 DOM + 动态 Vue 实例优势跨页面 / 不依赖页面组件树 / 灵活调用如果你使用的是小程序平台,DOM 操作可能受限,需要用或方式兼容处理。想支持多个弹窗堆叠?你可以扩展,加个弹窗队列管理器。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 944

指针以及内存分配

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

bizhu的专栏 1万+

Android15音频进阶之4种调试线程死锁利器(八十九)

本篇目的:Android15音频进阶之4种调试线程死锁利器对于开发者来说,最令人头疼的,莫过于多线程交互出问题的时候,我们应该从哪里找突破口呢?下面来介绍一下调试Android音频中线程死锁的四种方案线程死锁是并发编程中常见的问题之一,它指的是在多个线程竞争资源的过程中,由于相互等待对方持有的资源而无法继续执行,从而导致所有线程都无法向前推进的现象。死锁不仅会导致系统性能严重下降,甚至可能导致整个系统崩溃。线程死锁的产生有四个必要条件:互斥条件:资源不能被多个线程共同使用,只能由一个线程独占。

Android系统攻城狮 1996

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

内存管理

qq_51556066的博客 164

YOLOv8魔改系列:将CIoU替换成Wise-IoU,飞速涨点

将YOLOv8中CIoU替换成Wise-IoU,实现飞速涨点

qq_66386046的博客 2678

Devexpress16.2.6破解工具

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

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

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

hgj125073的专栏 676

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

weixin_30879833的博客 747

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

高质量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、付费专栏及课程。

余额充值