C語言動態內存管理(下)

歡迎拜訪:霧里看山-CSDN博客
本篇主題:C語言動態內存管理(下)
發布時間:2025.3.18
隸屬專欄:C語言

在這里插入圖片描述

目錄

  • 動態內存常見錯誤
    • 內存泄漏(Memory Leak)
      • 典型場景
      • 后果
      • 解決方案
    • 懸掛指針(Dangling Pointer)
      • 錯誤示例
      • 深層原理
      • 修復方案
    • 雙重釋放(Double Free)
      • 危險操作
      • 系統表現
      • 防護措施:
    • 越界訪問(Out-of-Bounds)
      • 典型錯誤
      • 內存影響
    • 未初始化訪問
      • 問題代碼
      • 隨機性危害
      • 防御性編程
    • 釋放棧區內容
      • 錯誤示例
      • 解決方案
    • 未全部釋放
      • 錯誤示例
      • 解決方案
  • C/C++程序的內存開辟

動態內存常見錯誤

內存泄漏(Memory Leak)

典型場景

void process_data() {int* buffer = malloc(1024 * sizeof(int));// 忘記調用 free(buffer)
}

后果

  • 程序持續運行時會不斷消耗內存
  • 長期運行的服務可能因此崩潰

解決方案

  • 遵循申請與釋放成對出現原則
  • 使用RAII模式(C可用__attribute__((cleanup))擴展)

懸掛指針(Dangling Pointer)

錯誤示例

int* create_int() {int value = 42;return &value; // 返回局部變量地址
}int main() {int* ptr = create_int();printf("%d", *ptr); // 不可預測結果
}

深層原理

  • 棧幀銷毀后,原地址可能被其他數據覆蓋
  • 堆內存釋放后若未置空,指針仍保存失效地址

修復方案

及時釋放,釋放后立即置空

free(ptr);
ptr = NULL; // 立即置空

雙重釋放(Double Free)

危險操作

對同一地址空間進行多次釋放

char* str = malloc(64);
free(str);
free(str);

系統表現

  • 可能立即引發segmentation fault
  • 可能破壞堆管理結構導致后續malloc失敗

防護措施:

  • 使用釋放后置空的編程規范
  • 在復雜邏輯中明確資源所有權

越界訪問(Out-of-Bounds)

典型錯誤

數組只開辟了[0,4]的空間,訪問時卻訪問了下標為5的空間。

int* arr = malloc(5 * sizeof(int));
for(int i=0; i<=5; i++) { // 索引0-4有效arr[i] = i; // i=5時越界
}

內存影響

  • 可能覆蓋相鄰內存的控制信息
  • 可能修改其他變量值導致邏輯錯誤

未初始化訪問

問題代碼

內存開辟出來未進行初始化就直接訪問。

int* p = malloc(sizeof(int));
printf("%d", *p);

隨機性危害

  • 可能意外修改關鍵內存區域
  • 在不同運行環境中表現不一致

防御性編程

指針定義時顯示初始化, 指針使用時進判空。

int* p = malloc(sizeof(int));
*p = 10;
printf("%d", *p);

釋放棧區內容

錯誤示例

對于非動態開辟出來的內存進行釋放

void test()
{int a = 10;int *p = &a;free(p);
}

解決方案

  • 遵循申請與釋放成對出現原則
  • 使用RAII模式(C可用__attribute__((cleanup))擴展)

未全部釋放

錯誤示例

在釋放內存的時候,創建時的指針和原來的指針已經不在同一個位置,直接釋放則會有內存錯誤。

void test()
{int *p = (int *)malloc(100);p++;free(p);
}

解決方案

在創建的時候,使用一個指針記錄起始位置,

void test()
{int *p = (int *)malloc(100);int *ptr=p;p++;free(ptr);
}

C/C++程序的內存開辟

在這里插入圖片描述
C/C++程序內存分配的幾個區域:

  1. 棧區(stack):在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。 棧區主要存放運行函數而分配的局部變量、函數參數、返回數據、返回地址等。
  2. 堆區(heap):一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。分配方式類似于鏈表。
  3. 數據段(靜態區)(static)存放全局變量、靜態數據。程序結束后由系統釋放。
  4. 代碼段:存放函數體(類成員函數和全局函數)的二進制代碼。

實際上普通的局部變量是在棧區分配空間的,棧區的特點是在上面創建的變量出了作用域就銷毀。
但是被static修飾的變量存放在數據段(靜態區),數據段的特點是在上面創建的變量,直到程序結束才銷毀所以生命周期變長。

?? 寫在最后:以上內容是我在學習以后得一些總結和概括,如有錯誤或者需要補充的地方歡迎各位大佬評論或者私信我交流!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72608.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72608.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72608.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue:Vue2和Vue3創建項目的幾種常用方式以及區別

前言 Vue.js 和 Element UI 都是用 JavaScript 編寫的。 1、Vue.js 是一個漸進式 JavaScript 框架。2、Element UI 是基于 Vue.js 的組件庫。3、JavaScript 是這兩個項目的主要編程語言。 而Element Plus是基于TypeScript開發的。 一、Vue2 1、基于vuecli工具創建 vue2 …

機器人曲面跟蹤Surface-Tracking

定義 機器人曲面跟蹤&#xff08;Surface-Tracking&#xff09;是指機器人通過實時感知工件曲面的三維形貌&#xff0c;動態調整運動軌跡和位姿&#xff0c;以精確跟隨曲面進行加工&#xff08;如打磨、拋光、噴涂等&#xff09;的技術。 力 - 位姿協同控制 力控模式&#xff…

網絡安全運維應急響應與溯源分析實戰案例

在日常運維過程中&#xff0c;網絡安全事件時有發生&#xff0c;快速響應和精準溯源是保障業務穩定運行的關鍵。本文將通過一個實際案例&#xff0c;詳細解析從發現問題到溯源定位&#xff0c;再到最終解決的完整流程。 目錄 一、事件背景 二、事件發現 1. 監控告警觸發 2…

【AVRCP】藍牙協議棧深度解析:AVCTP互操作性核心機制與實現細節

目錄 一、事務標簽&#xff08;Transaction Label&#xff09;機制 1.1 事務標簽核心規則 1.2 事務標簽作用域與并發性 1.3 實現建議與陷阱規避 1.4 協議設計思考 1.5 調試與驗證 二、消息分片&#xff08;Fragmentation&#xff09;機制 2.1 分片觸發條件 2.2 分片支…

harmonyOS NEXT開發與前端開發深度對比分析

文章目錄 1. 技術體系概覽1.1 技術棧對比1.2 生態對比 2. 開發范式比較2.1 鴻蒙開發范式2.2 前端開發范式 3. 框架特性對比3.1 鴻蒙 Next 框架特性3.2 前端框架特性 4. 性能優化對比4.1 鴻蒙性能優化4.2 前端性能優化 5. 開發工具對比5.1 鴻蒙開發工具5.2 前端開發工具 6. 學習…

OpenWebUI:一站式 AI 應用構建平臺體驗

&#x1f680; 大家好&#xff0c;今天給大家分享一個超棒的 AI 應用構建工具——OpenWebUI&#xff01;體驗下來&#xff0c;只能說絲滑&#xff01;必須強烈推薦&#xff01; &#x1f525; 聽說過阿里巴巴的 Qwen 嗎&#xff1f;他們最新的 Qwen Chat 網站就是用 OpenWebUI…

多線程—進程與線程

1 進程 1.1 進程概念 進程&#xff1a;操作系統提供的一種抽象&#xff0c;當程序在運行時&#xff0c;好像計算機的所有硬件資源都在為其服務。換言之&#xff0c;進程就是程序的一次運行過程。進程是操作系統分配資源的基本單位。 注意&#xff1a;區分進程和程序&#xff0…

[原創](Modern C++)現代C++的關鍵性概念: 靈活多變的綁定: std::bind

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、C …

ssm框架之mybatis框架動態SQL

1 mybatis動態sql mybatis可以通過各種各樣的標簽在sql映射文件中實現如下功能 1、語句的動態拼接 2、前后綴格式處理 3、復雜參數處理 常用標簽如下&#xff1a; 1.1 if標簽 如下示例&#xff0c;當有一個入參為null或者空的時候的時候&#xff0c;不參與計算&#xff0c;…

Spring Boot 事務詳解

Spring Boot 事務詳解 引言 在現代應用程序中&#xff0c;事務管理是確保數據一致性和完整性的重要機制。Spring Boot 提供了強大的事務管理功能&#xff0c;使得開發者可以輕松地定義和管理事務。本文將詳細介紹 Spring Boot 中的事務管理&#xff0c;包括事務傳播行為、事務…

poetry使用

1.初始化 package name 填入口文件名 poetry init2.在本目錄下虛擬 poetry config virtualenvs.in-project true 3.自動生成依賴文件和vent虛擬環境&#xff0c;管理本項目下載包 poetry add flask pandas numpy 4 4.下載依賴 poetry install 5.查看都安裝了什么包 poe…

Git 新建本地分支并關聯到遠程倉庫

文章目錄 1、方法一2、方法二 1、方法一 A、新建本地分支&#xff1a; git checkout -b new-branch-nameB、push新分支到遠程倉庫&#xff1a; git push origin newBranchC、本地分支關聯到遠程&#xff08;選一個即可&#xff09;&#xff1a; git branch --set…

一條SQL在mysql數據庫中經歷的過程

SQL語句在MySQL數據庫中普遍經歷的過程如下&#xff1a; 客戶端發起查詢請求到MySQL數據庫服務器監聽端口&#xff1b; MySQL數據庫server端接收到請求&#xff1b; server端從已有的連接池或者新建一個線程&#xff0c;用來處理客戶端發起的請求&#xff1b; server層…

Compose 的產生和原理

引言 compose 出現的目的&#xff1a; 重新定義android 上ui 的編寫方式。為了提高android 原生ui開發效率。讓android 的UI開發方式跟上時代。 正文 compose 是什么&#xff1f; 就是一套ui框架 和flutter 一樣是一套ui框架 Flutter&#xff1a;跨平臺開發趨勢與企業應用的…

【計算機網絡】一二章

一 二 非常棒的例子 相同的傳播時延&#xff0c;帶寬越大&#xff0c;該鏈路上所能容納的比特數越多 相同的傳播時延&#xff0c;帶寬越大&#xff0c;該鏈路上所能容納的比特數越多 往返時間&#xff08;Round-Trip Time&#xff0c;RTT&#xff09;s是指從發送端發送數據分組…

微軟OneNote無法同步解決方案

目錄 前言原因UWP特性 解決方案C***h注冊表 參考鏈接 前言 假設有多臺Windows電腦&#xff0c;最方便且免費的多設備筆記同步方案就是微軟自家的OneNote&#xff0c;使用OneDrive自帶的5G云存儲。 但是在國內大陸的OneNote&#xff0c;經常會出現無法同步、同步失敗&#xff1…

《商業智能(BI)的演進:從數據倉庫到智能決策》

01、什么是商業智能BI&#xff1f; 商業智能BI - 派可數據商業智能BI可視化分析平臺 首先要了解什么是商業智能BI&#xff08; Business Intelligence &#xff09;&#xff1f;百度商業智能BI有很多很多官方的定義&#xff0c;各種解釋&#xff0c;實際上從這么多年的經驗出發…

云鑰科技工業相機定制服務,助力企業實現智能智造

在工業自動化、智能制造和機器視覺快速發展的今天&#xff0c;工業相機作為核心感知設備&#xff0c;其性能直接決定了檢測精度、生產效率和產品質量。然而&#xff0c;標準化工業相機往往難以滿足復雜多樣的應用場景需求&#xff0c;?工業相機定制?逐漸成為企業突破技術瓶頸…

LeetCode[19]刪除鏈表的倒數第N個節點

思路&#xff1a; 要想一次循環&#xff0c;一趟遍歷完&#xff0c;那肯定是要想到雙指針了&#xff0c;但是雙指針怎么做呢&#xff1f;題目給出刪除倒數第N個&#xff0c;我們如果能找到倒數第N個節點的前一個節點就行了&#xff0c;倒數第N個肯定是倒著數&#xff0c;那我們…

API調用大模型推理與第三方API實現業務整合

基于Python實現大模型推理與第三方API調用的集成&#xff0c;需要結合Function Call機制與提示詞工程。 一、技術架構設計 雙階段流程 推理階段&#xff1a;大模型解析用戶意圖&#xff0c;生成結構化API調用指令執行階段&#xff1a;Python代碼解析指令并觸發第三方API # 示例…