
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),僅供參考