C\C++內存管理(未完結)

文章目錄

  • 一.C\C++內存分布
  • 二.C語言中動態內存管理方式:malloc/calloc/realloc/free
  • 三.C++內存管理方式
    • 3.1.new/delete操作內置類型
    • 3.2.new和delete操作自定義類型
  • 四.operator new與operator delete函數(重要點進行講解)
    • 4.1. operator new與operator delete函數(重點)
  • 五.new和delete的實現原理
    • 5.1.內置類型
    • 5.2 自定義類型
  • 六. 定位new表達式(placement-new) (了解)
  • 七. 7. 常見面試題
    • 7.1. malloc/free和new/delete的區別
    • 7.2 內存泄漏

一.C\C++內存分布

C和C++的內存分布是一樣的
為什么要內存區域劃分?
為了內存方便管理
下面的劃分的區域 堆區是我們重點關注的,因為堆上的空間是由我們開辟和釋放的,是由我們控 制的。

在這里插入圖片描述在操作系統的層面角度叫數據段,在語言的角度上叫靜態區
看代碼回答 問題?

int globalVar = 1;static int staticGlobalVar = 1;void Test(){static int staticVar = 1;int localVar = 1;int num1[10] = { 1, 2, 3, 4 };char char2[] = "abcd";const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3);}1. 選擇題:
選項: A.棧  B.堆  C.數據段(靜態區)  D.代碼段(常量區)globalVar在哪里?____   staticGlobalVar在哪里?____staticVar在哪里?____   localVar在哪里?____num1 在哪里?____char2在哪里?____       
pChar3在哪里?____      
ptr1在哪里?____        
2. 填空題:
sizeof(num1) = ____;   
*char2在哪里?___*pChar3在哪里?____*ptr1在哪里?____sizeof(char2) = ____;      
sizeof(pChar3) = ____;     
sizeof(ptr1) = ____;3. sizeof 和 strlen 區別?
strlen(char2) = ____;strlen(pChar3) = ____;

答案
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
【說明】

  1. 棧又叫堆棧–非靜態局部變量/函數參數/返回值等等,棧是向下增長的。
  2. 內存映射段是高效的I/O映射方式,用于裝載一個共享的動態內存庫。用戶可使用系統接口
    創建共享共享內存,做進程間通信。(Linux課程如果沒學到這塊,現在只需要了解一下)
  3. 堆用于程序運行時動態內存分配,堆是可以上增長的。
  4. 數據段–存儲全局數據和靜態數據。
  5. 代碼段–可執行的代碼/只讀常量。

二.C語言中動態內存管理方式:malloc/calloc/realloc/free

void Test (){int* p1 = (int*) malloc(sizeof(int));free(p1);// 1.malloc/calloc/realloc的區別是什么?
int* p2 = (int*)calloc(4, sizeof (int));int* p3 = (int*)realloc(p2, sizeof(int)*10);// 這里需要free(p2)嗎? 不需要 原地擴容p3 還是p2接收地址 異地擴容 自動free(p2)
free(p3 );}

【面試題】

  1. malloc/calloc/realloc的區別?
  2. malloc的實現原理? glibc中malloc實現原理

三.C++內存管理方式

C語言內存管理方式在C++中可以繼續使用,但有些地方就無能為力,而且使用起來比較麻煩,因
此C++又提出了自己的內存管理方式:通過new和delete操作符進行動態內存管理。

3.1.new/delete操作內置類型

void Test(){// 動態申請一個int類型的空間
int* ptr4 = new int;// 動態申請一個int類型的空間并初始化為10int* ptr5 = new int(10);// 動態申請10個int類型的空間
int* ptr6 = new int[3];delete ptr4;delete ptr5;delete[] ptr6;}
int main()
{	//開辟一個空間int* ptr = new int;//開辟一共int類型的空間 在堆區 返回一共堆上開辟好的空間地址//開辟一個空間并且初始化int* ptr1 = new int(10); //只需要在開辟空間類型中+(初始化值)即可cout <<"ptr1存放地址對應值:" << *ptr1 << endl;//開辟多個空間int* ptr2 = new int[10];//在開辟空間類型后加上+[開辟個數]即可 并返回開辟數組(多個空間)的首地址//開辟多個空間并且初始化 在之前c++是不允許開辟的數組初始化的 C++11就可以了int* ptr3 = new int[10] {1, 2, 3, 4, 5};//開辟數組空間 初始化用{里面寫初始化值} 可以完全初始化 也可不完全初始化 不完全初始化的空間默認初始化為0int arr[5] = { 1,2,3,4,5 };//將開辟好的空間 釋放掉 delete(ptr);delete(ptr1);delete[](ptr2); //數組的釋放 連續的空間釋放+delete[] 指針存放地址delete[](ptr3);return 0;
}

在這里插入圖片描述
注意:申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續的空間,使用new[]和delete[],注意:匹配起來使用。

3.2.new和delete操作自定義類型

class A{public:A(int a = 0): _a(a){cout << "A():" << this << endl;}~A(){}cout << "~A():" << this << endl;private:int _a;};int main(){// new/delete 和 malloc/free最大區別是 new/delete對于【自定義類型】除了開空間還會調用構造函數和析構函數
A* p1 = (A*)malloc(sizeof(A));A* p2 = new A(1);free(p1);delete p2;// 內置類型是幾乎是一樣的
int* p3 = (int*)malloc(sizeof(int)); // Cint* p4 = new int;free(p3);delete p4;A* p5 = (A*)malloc(sizeof(A)*10);A* p6 = new A[10];free(p5);delete[] p6;return 0;}

注意:在申請自定義類型的空間時,new會調用構造函數,delete會調用析構函數,而malloc與free不會。
new開辟空間失敗會拋異常,不需要手動檢查
拋異常 捕獲異常
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

四.operator new與operator delete函數(重要點進行講解)

4.1. operator new與operator delete函數(重點)

五.new和delete的實現原理

5.1.內置類型

5.2 自定義類型

六. 定位new表達式(placement-new) (了解)

七. 7. 常見面試題

7.1. malloc/free和new/delete的區別

7.2 內存泄漏

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

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

相關文章

npm install 出錯,‘proxy‘ config is set properly. See: ‘npm help config‘

背景 從遠程clone下項目之后&#xff0c;使用命令 npm install 安裝依賴&#xff0c;報錯如下 意為&#xff1a; 報錯&#xff1a; npm犯錯!network與網絡連通性有關的問題。 npm犯錯!網絡在大多數情況下&#xff0c;你背后的代理或有壞的網絡設置。 npm犯錯!網絡 npm犯錯…

spring-kafka-生產者服務搭建測試(SpringBoot整合Kafka)

文章目錄 1、生產者服務搭建1.1、引入spring-kafka依賴1.2、使用Java代碼創建主題分區副本1.3、發送消息 1、生產者服務搭建 1.1、引入spring-kafka依賴 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/…

KOL營銷新篇章:互動式內容與線上活動如何助力品牌增長

在當今數字化時代&#xff0c;KOL營銷已成為品牌推廣的重點策略之一。然而&#xff0c;隨著市場競爭的加劇&#xff0c;單純依靠KOL的曝光已經不再足夠&#xff0c;更多的是需要與用戶進行互動&#xff0c;幫助品牌與受眾建立更緊密的聯系。本文將探討KOL營銷如何通過互動式內容…

《企業應用架構模式》學習指南

導讀&#xff1a;企業應用包括哪些&#xff1f;它們又分別有哪些架構模式&#xff1f; 世界著名軟件開發大師Martin Fowler給你答案 01什么是企業應用 我的職業生涯專注于企業應用&#xff0c;因此&#xff0c;這里所談及的模式也都是關于企業應用的。&#xff08;企業應用還有…

怎么用NodeJS腳本實現遠程控制空調

怎么用NodeJS腳本實現遠程控制空調呢&#xff1f; 本文描述了使用NodeJS腳本調用HTTP接口&#xff0c;實現控制空調&#xff0c;通過不同規格的通斷器&#xff0c;來控制不同功率的空調的電源。 可選用產品&#xff1a;可根據實際場景需求&#xff0c;選擇對應的規格 序號設備…

MySQL從入門到高級 --- 12.事務 13.鎖機制 14.日志

文章目錄 第十二章 && 第十三章 && 第十四章&#xff1a;12.事務12.1 特性12.2 隔離級別 13.鎖機制13.1 各存儲引擎對鎖的支持狀況&#xff1a;13.2 鎖特性13.3 MyISAM表鎖13.3.1 加表鎖 13.4 InnoDB行鎖13.4.1 行鎖特點13.4.2 行鎖模式 14.日志14.1 錯誤日志1…

深入理解計算機系統 第三版 中文版 圖5-27 p371 錯漏

中文版 英文版 對照 可以看出錯漏 這本書中文版很多錯漏,可以配合英文版查正,不過英文版也很多錯漏,所以不用太相信書本.要根據自己的理解來.

微軟云計算Windows Azure(一)

目錄 一、微軟云計算平臺二、微軟云操作系統Windows Azure&#xff08;一&#xff09;Windows Azure概述&#xff08;二&#xff09;Windows Azure計算服務&#xff08;三&#xff09;Windows Azure存儲服務&#xff08;四&#xff09;Windows Azure Connect&#xff08;五&…

Win 11官宣取消硬件限制,微軟這次徹底服軟了

上市近 3 年&#xff0c;微軟寄予厚望的 Win 11 終究落了個被上代 Win 10 光環狠狠掩埋的結局。 有小伙伴兒認為是 Win 11 本身做的太爛&#xff0c;更新頻繁、BUG 一堆&#xff0c;讓人失去興趣。 也有人認為&#xff0c;系統本身體驗沒啥大毛病&#xff0c;嚴苛的硬件限制才…

數據結構算法-堆排序

堆排序&#xff1a;利用堆的特性進行排序,先將數組轉換為堆對象&#xff08;最大堆或最小堆&#xff09;&#xff0c;以最大堆為例&#xff0c;每次heapify之后&#xff0c;取出堆頂&#xff08;索引為0)的元素與最后一個元素交換。以后每次做同樣的事情&#xff0c;只是堆的長…

Golang性能分析工具pprof--遠程分析時無法定位源代碼行數問題解決方案

場景 通過命令行模式的list命令&#xff0c;為了查看指標消耗在具體哪一行&#xff0c;需要源代碼。但實際程序是部署在線上或者程序的源代碼目錄變了&#xff0c;則pprof從默認路徑找不到代碼&#xff0c;無法顯示是哪一行的問題。 通過瀏覽器模式的source頁面&#xff0c;有…

JUC總結3

CAS 簡介 CAS的全稱是“比較并交換”&#xff0c;是一種無鎖的原子操作&#xff0c;其體現了樂觀所的思想&#xff0c;在無鎖的情況下保證線程操作共享數據的原子性。 CAS一共有3個值&#xff1a; 1、V&#xff1a;要更新的值&#xff1b; 2、E&#xff1a;預期值&#xf…

RHCE (Linux進階) Ubuntu 操作系統安裝教程

一、在官網下載iso鏡像文件 下載地址&#xff1a; https://cn.ubuntu.com/download/server/step1#downloads&#xff08;下載最新的Ubuntu 20.04 LTS服務器版本&#xff09; 二、VMware安裝配置過程 基本安裝過程 1、新建虛擬機 2、選擇典型即可 3、設置下載好的Ubuntu對應路…

Exception異常機制詳細講解

目錄 一、異常1.1 什么是異常1.2 異常機制的作用1.3 常見的異常2.3 異常的分類1. Error2. Exception① 運行時異常② 編譯期異常總結&#xff1a; 二、異常的處理2.1 拋出異常3.1 拋出異常語法3.2 試圖捕獲異常3.3 捕獲異常與拋出異常的區別1. 拋出異常2.捕獲異常 三、finally四…

Spring Cloud:構建高可用分布式系統的利器

摘要&#xff1a;本文將介紹Spring Cloud&#xff0c;一個基于Spring Boot的開源微服務架構工具集。我們將探討Spring Cloud的核心組件、特性以及如何使用Spring Cloud構建高可用、分布式系統。通過本文&#xff0c;讀者將了解到Spring Cloud在實現微服務架構中的應用和優勢。 …

【Springcloud微服務】MybatisPlus下篇

&#x1f525; 本文由 程序喵正在路上 原創&#xff0c;CSDN首發&#xff01; &#x1f496; 系列專欄&#xff1a;Springcloud微服務 &#x1f320; 首發時間&#xff1a;2024年6月4日 &#x1f98b; 歡迎關注&#x1f5b1;點贊&#x1f44d;收藏&#x1f31f;留言&#x1f43…

24、matlab二維和三維網格(meshgrid函數)以及散點數據插值 griddata()函數

1、二維和三維網格(meshgrid函數) 語法 語法1:[X,Y] = meshgrid(x,y) 基于向量 x 和 y 中包含的坐標返回二維網格坐標。 語法2:[X,Y] = meshgrid(x) 與 [X,Y] = meshgrid(x,x) 相同,并返回網格大小為 length(x)length(x) 的方形網格坐標。 語法3:[X,Y,Z] = meshgrid(x,y,…

汽車銷售門店零售價格違規檢查的實踐經驗方法

隨著汽車市場的蓬勃發展&#xff0c;汽車銷售門店的零售價格合規性日益受到業界和消費者的關注。為確保銷售過程的公平與透明&#xff0c;開展零售價格違規檢查顯得尤為重要。 在這方面&#xff0c;深圳神秘顧客&#xff08;SMS&#xff09;公司憑借其深厚的實踐經驗和專業技巧…

弘君資本炒股開戶:如何看待股價波動?

在股票商場上股價的動搖無疑是投資者最為關心的話題之一&#xff0c;面臨股價的起伏不定投資者往往會感到迷茫和焦慮。關于怎么看待股價動搖&#xff0c;弘君資本下面就為大家詳細介紹一下。 股價動搖是股市運行的常態&#xff0c;股市是國民經濟的晴雨表&#xff0c;股票價格…

Flink run 自動化運行任務shell腳本

Linux命令行&#xff1a; sh flink_run.sh test com.dzj.app.base.test.FlinkKafkaOffsetTest /root/soft/test.jar flink_run.sh腳本內容&#xff1a; #!/bin/bash# 檢查參數數量是否正確 if [ "$#" -ne 3 ]; thenecho "錯誤&#xff1a;需要提供 3 個參數&…