尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

C++指针与数组的区别、浅拷贝与深拷贝一次讲透:内存管理完整指南

C++指针与数组的区别、浅拷贝与深拷贝一次讲透:内存管理完整指南 C指针与数组的区别、浅拷贝与深拷贝一次讲透内存管理完整指南【免费下载链接】GameDeveloper-Client-Interview게임 클라이언트 개발자 면접 리스트 정리입니다项目地址: https://gitcode.com/gh_mirrors/ga/GameDeveloper-Client-Interview对于准备游戏客户端面试的初学者来说C指针、数组以及浅拷贝、深拷贝是绕不开的三大基础考点。本文用大白话把这些概念一次讲透帮你系统梳理C内存管理的核心知识无论是理解int arr[]与int* p的关系还是搞清对象赋值时拷了什么、没拷什么都能在这里找到答案。读完这篇指南你就能从容应对面试官关于指针、数组与内存的经典追问。1️⃣ 指针和数组到底什么关系很多人初学时会困惑指针和数组到底是不是一回事一句话总结数组本质上也可以看作一个只读的指针——因为数组名指向的就是连续元素的首地址。但两者的关键区别在于对比项数组指针本质连续元素的集合数组名即首地址存放地址的变量能否重新赋值❌ 数组名是常量不能改变指向✅ 可以随时指向新地址能否/❌ 不支持增址运算✅ 支持p、p 1内存位置通常在栈上固定大小变量本身在栈上可指向堆内存打个比方数组就像写死在快递单上的固定仓库地址而指针是一张可以随时换写的便签纸今天指向这个仓库明天就能指向那个仓库。 面试高频追问为什么a合法而arr非法答案就在于——数组名是常量指针变量才可以被修改。2️⃣ 浅拷贝 vs 深拷贝对象赋值时的隐形陷阱这是面试中几乎必问的深拷贝与浅拷贝Shallow Copy / Deep Copy问题。浅拷贝只复制成员变量本身。如果成员是一个指针那么复制的只是地址两个对象的指针指向同一块内存。深拷贝在浅拷贝的基础上把指针所指向的那块内存也重新分配并复制一份两个对象从此彻底独立。用生活化比喻浅拷贝 把家门钥匙复制了一把两个人拿着钥匙进的是同一套房深拷贝 另买了一套房子连房间里的家具都重新做了一份。⚠️ 浅拷贝的危险在于当一个对象delete了自己指向的内存另一个对象的指针就变成了悬空指针Dangling Pointer此时再访问就会引发未定义行为轻则崩溃重则难查的内存错误。 一个容易混淆的点C# 中浅拷贝指的是只复制堆对象的引用两个变量指向同一对象和 C 的术语习惯不同。如果你是从 Unity/C# 转过来的开发者尤其要注意这层差异。什么时候必须实现深拷贝当你的类通过new/malloc在堆上持有资源比如int* data、char* name时默认的拷贝构造函数和拷贝赋值运算符只会做浅拷贝你需要手动实现拷贝构造 拷贝赋值 析构即 Rule of Three避免 double free。3️⃣ 内存管理的三个经典坑理解了指针与拷贝再把目光放到内存管理上游戏客户端面试最关心的就是下面三类问题坑一内存泄漏Memory Leaknew了却没有delete或malloc后没有free内存永远不会被回收。一个特别容易被忽略的场景是通过基类指针 delete 派生类对象如果基类没有声明虚析构函数只会调用基类的析构派生类中动态分配的资源就此泄漏。✅ 经验法则类被用作基类时析构函数尽量声明为virtual。坑二悬空指针Dangling Pointerdelete之后没有把指针置为nullptr旧指针还以为自己指向有效对象。移动语义Move Semantics中也遵循同样原则对象被移动走后原对象持有的指针会被置空防止两侧都去 delete。坑三内存碎片频繁的new/delete会造成堆内存碎片化分配大内存时找不到连续空间。这也是为什么重复重分配场景下realloc往往比反复new/delete更划算。4️⃣ 现代C的解法智能指针与RAII既然手动new/delete容易出错现代 C 推荐用智能指针来接管内存管理智能指针所有权模型适用场景unique_ptr独占所有权不可复制默认首选90% 的场景shared_ptr引用计数共享计数归零时释放多方共同拥有所需weak_ptr弱引用不参与计数打破shared_ptr循环引用它们的底层思想是RAII资源获取即初始化资源在构造时获取、析构时自动释放。只要对象出了作用域哪怕中途抛异常内存也会被自动回收——再也不用担心忘记delete。⚠️ 进阶追问预警两个shared_ptr互相指针对方会形成循环引用引用计数永远无法归零造成内存泄漏。此时引入weak_ptr即可化解这是面试深挖的高频点。5️⃣ 面试速记卡片 把本文浓缩成 5 句话面试前快速过一遍数组名是常量、指向首地址指针是可变的地址变量。浅拷贝只拷成员值指针成员会共享同一块堆内存。深拷贝额外复制指针指向的内容两个对象完全独立。堆上持有资源的类要实现深拷贝并警惕 double free。优先使用unique_ptr/shared_ptr RAII 自动管理内存基类记得加虚析构函数。掌握以上内容你就能在面试中把指针与数组、浅拷贝与深拷贝、内存泄漏与悬空指针这条知识链完整串起来。建议再结合项目中 C/ 目录下的其他笔记如L-value, R-value、Move Semantics、smart pointer相关章节做延伸学习逐步构建起扎实的 C 内存管理知识体系离游戏客户端开发者的目标又近一步【免费下载链接】GameDeveloper-Client-Interview게임 클라이언트 개발자 면접 리스트 정리입니다项目地址: https://gitcode.com/gh_mirrors/ga/GameDeveloper-Client-Interview创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表