詳解 new 和 delete

目錄

一、簡要描述兩者的作用

二、實例解析

1. 淺層區別

2. 深層區別

三、拓展(operator new 的妙用)


一、簡要描述兩者的作用

new : 是c++推崇的 內存申請 方式,擁有比 malloc 更先進的機制

delete :是 對應的 內存釋放方式,擁有比 free 更先進的機制

二、實例解析

1. 淺層區別

malloc 需要 計算實際需要的 字節數,而 new 則不需要

new 在申請基礎類型內存塊時,可以對 空間進行初始化 ,malloc 則不會

new 在內存申請失敗后 會拋出異常,?而 malloc 則是返回NULL 需要對指針進行 NULL 檢查

int main()
{int* arr = (int*)malloc(sizeof(int)*2);if (arr == NULL){cout << "檢查后 -- malloc 失敗" << endl;return 1;}elsecout << arr[0] << " " << arr[1] << endl;int* arr2 = new int[2] {1, 2};cout << arr2[0] << " " << arr2[1] << endl;return 0;
}

2. 深層區別

在對自定義類型(類,結構體等)進行內存申請時,malloc 同樣只是申請對應 字節大小的空間,而 new 則會在申請后,去調用 自定義類型的 構造方法,對其進行初始化

同樣 delete 在 釋放 空間時 會去調用對應的 析構方法,實現對 類對象的 完全釋放,避免成員指針指向空間沒有被釋放的 泄露問題。

class Test_new_delete
{
public:Test_new_delete(){_arrptr = new int[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};cout << "new 主動調用構造方法 " << endl;}~Test_new_delete(){cout << "delete 主動調用析構方法 并對成員指針進行了釋放防止內存泄漏 " << endl;delete[] _arrptr;}int* _arrptr;
};
int main()
{Test_new_delete* ptr0 = (Test_new_delete*)malloc(sizeof(ptr0));cout << "malloc 創建的ptr0 沒有進行初始化 :" << ptr0->_arrptr << endl;free(ptr0);cout << "free 只是釋放了的內存塊,但是其中的指針所指向的空間并沒有被釋放,會造成內存泄露 " << endl;cout << endl << " ----------- " << endl << endl;Test_new_delete* ptr = new Test_new_delete;cout << "malloc 創建的ptr 通過調用構造方法進行初始化 :" << ptr->_arrptr << endl;delete ptr;return 0;
}

三、拓展(operator new 的妙用)

1. 在 調用 new? 之后 ,new 內部會去調用 operator new? ,庫中operator new 再去調用 malloc 進而進行內存申請,但是 operator new 中還會 在申請內存后進行 檢查,如果malloc 內存申請失敗 則會進行拋異常。

2. 用戶可以在類中 對 operator new 進行重載,進而實現 指定類在調用 new 之后 ,去調用 自己實現 的 operator new ,而不調用 庫函數,進一步實現 功能的自定義


class ST
{
public :void* operator new(size_t i){cout << "調用自己實現的 operator new" << endl;return (void*) 9;}
};
int main()
{void* ptr = new ST();cout << ptr << endl;return 0;
}

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

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

相關文章

fMoE論文閱讀筆記

原文鏈接&#xff1a;https://arxiv.org/pdf/2502.05370v1 在混合專家&#xff08;MoE&#xff09;架構中&#xff0c;初始階段涉及輸入樣本通過GateNet進行多分類的鑒別過程&#xff0c;目的是確定最適合處理輸入的專家模型。這個步驟被稱為“experts selection”&#xff0c;…

Linux 禪道開源版安裝

1、下載安裝包安裝wget https://www.zentao.net/dl/zentao/18.5/ZenTaoPMS.18.5.zbox_64.tar.gz tar zxf ZenTaoPMS.18.5.zbox_64.tar.gz/opt/zbox/zbox -ap 81 -mp 3307 # 指定apache服務端口 、 mysql服務端口 /opt/zbox/zbox start #啟動禪道服務( 其他命令 /opt/zbox/…

PySpark基礎知識(python)

PySpark 是 Apache Spark 的 Python API&#xff0c;它允許開發者使用 Python 語言編寫 Spark 應用程序&#xff0c;結合了 Python 的易用性和 Spark 的分布式計算能力&#xff0c;是處理大規模數據的強大工具。 一、安裝與環境配置 安裝方式&#xff1a; 通過 pip 安裝&#…

基于python大數據的電影數據分析可視化系統設計與應用

標題:基于python大數據的電影數據分析可視化系統設計與應用內容:1.摘要 本研究旨在設計并實現一個基于Python的大數據電影數據分析與可視化系統&#xff0c;以解決當前電影行業數據分散、分析效率低及可視化能力不足的問題。系統采用Python語言結合Pandas、NumPy進行數據清洗與…

【PyTorch】圖像多分類

多類圖像分類的目標是為一組固定類別中的圖像分配標簽。目錄 加載和處理數據 搭建模型 定義損失函數 定義優化器 訓練和遷移學習 用隨機權重進行訓練 用預訓練權重進行訓練 加載和處理數據 將使用 PyTorch torchvision 包中提供的 STL-10 數據集&#xff0c;數據集中有…

計算機視覺----opencv實戰----指紋識別的案例

一、數據準備src2.BMPsrc1.BMPsrc.bmpmodel.BMP二、識別原理講解&#xff08;sift特征提取&#xff09;SIFT&#xff08;Scale-Invariant Feature Transform&#xff0c;尺度不變特征變換&#xff09;是一種經典的圖像特征提取算法&#xff0c;核心優勢是不受圖像尺度縮放、旋轉…

npm 發布流程——從創建組件到發布到 npm 倉庫

1. 準備組件 1.1 創建一個 Vue 組件 假設我們要創建一個簡單的按鈕組件&#xff1a; src/MyButton.vue <template><button class"my-btn" click"$emit(click)"><slot /></button> </template><script setup lang"ts…

MySQL入門基礎指南

目錄 一、什么是數據庫&#xff1f; 僅依靠文件存儲數據存在以下幾個明顯缺點&#xff1a; 數據庫的存儲介質通常包括&#xff1a; 二、主流數據庫介紹 三、客戶端 VS 服務器 四、推薦看的MySQL安裝技術博客 五、數據庫的存儲介質 數據庫的存儲介質主要分為以下兩類&am…

【實戰中提升自己完結篇】分支篇之分支之無線、內網安全與QOS部署(完結)

1 1拓撲 「模擬器、工具合集」復制整段內容 鏈接&#xff1a;https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab7ulgil1 分支無線部署 說明&#xff1a;分支無線用瘦AP部署&#xff0c;通過VPN直接注冊到總部的AC上面&#xff0c;實現無線的業務提供&…

帶你了解STM32:GPIO通用輸入輸出口

目錄 3.1 GPIO簡介 3.2 GPIO基本結構 3.3 GPIO位結構 輸入部分&#xff1a; 二極管的保護作用&#xff1a; 施密特觸發器&#xff1a; 片上外設端口 輸出部分&#xff1a; MOS管 3.4 GPIO模式 3.4.1 浮空/上拉/下拉輸入 3.4.2 模擬輸入 3.4.3 開漏/推挽輸出 3.4.…

Http(自寫)

作為一個程序員&#xff0c;假設我們要在a電腦的進程里發一段數據到b電腦&#xff0c;一般使用socket編程&#xff0c;可選項也就tcp&#xff0c;udp二選一socket本質上就是一個代碼庫tcp有粘包問題&#xff08;字節流&#xff09;&#xff0c;純裸tcp不能之際拿來使用所以我們…

C#使用OpenVinoSharp和PP-Human進行行人檢測

效果 項目依賴 OpenCvSharp 4.11.0.20250507 OpenVINO.CSharp.Windows 2024.0.0.1 主要代碼 using OpenCvSharp; using OpenVinoSharp; using System; using System.Windows.Forms;namespace HelloPPHuman {public partial class Form1 : Form{public Form1(){InitializeCo…

四、Scala深入面向對象:類、對象與伴生關系

在前幾節中&#xff0c;我們學習了 Scala 的基礎語法和流程控制。現在&#xff0c;我們將深入探索 Scala 作為一門純粹的面向對象語言的核心。在 Scala 中&#xff0c;萬物皆對象&#xff0c;沒有像 Java 那樣的原始類型和靜態成員的區分。本節將重點介紹如何定義對象的藍圖&am…

【大語言模型 58】分布式文件系統:訓練數據高效存儲

分布式文件系統&#xff1a;訓練數據高效存儲 關鍵詞&#xff1a;分布式文件系統、HDFS、Lustre、GlusterFS、數據本地性、I/O優化、存儲架構、大數據存儲、訓練數據管理、存儲性能調優 摘要&#xff1a;本文深入探討大語言模型訓練中的分布式文件系統技術&#xff0c;從存儲架…

【科研繪圖系列】R語言繪制散點圖以及線性回歸擬合曲線圖

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 加載R包 數據下載 函數 導入數據 數據預處理 畫圖 總結 系統信息 介紹 數據導入 代碼的開始部分涉及多個數據集的導入,這些數據集涵蓋了不同類型的生態學數據,包括實驗室培養…

SQL 數據庫操作語言詳解

1. SQL 語言概述SQL&#xff08;Structured Query Language&#xff09;是用于管理關系型數據庫的標準語言&#xff0c;主要分為以下幾個子語言&#xff1a;- DQL&#xff08;數據查詢語言&#xff09;&#xff1a;SELECT - 用于數據查詢 - DML&#xff08;數據操作語言&#x…

積分變換的前世今生

積分變換常應用于解微分方程微分方程的解法&#xff1a;時域經典法&#xff1b;頻域變換法&#xff1b;“積分變換”最初并不是為了解微分方程&#xff0c;而是出于更“純粹”的數學動機——理解函數的結構、求解代數或幾何問題&#xff0c;以及簡化復雜的積分運算。微分方程的…

《Linux——gflags》

一、什么是gflags&#xff1f; gflags 是一個由 Google 開發的命令行參數解析庫&#xff0c;主要用于在 C&#xff08;也支持其他語言&#xff09;程序中便捷地處理命令行參數。它的核心作用是幫助開發者快速定義、解析和使用命令行選項&#xff0c;避免手動編寫繁瑣的參數解析…

編譯器的前端中端和后端

前面說的詞法分析和語法分析&#xff0c;確實是編譯器前端 (Front End) 最核心的兩個部分。但前端的工作還沒有結束。編譯器各階段劃分 一個完整的編譯器通常可以分為三個部分&#xff1a;前端、中端 (Middle End)、后端 (Back End)。 前端 (Front End) 核心職責: 理解源代碼。…

黑馬Java進階教程,全面剖析Java多線程編程,并發和并行,筆記02

黑馬Java進階教程&#xff0c;全面剖析Java多線程編程&#xff0c;并發和并行&#xff0c;筆記02 一、并發和并行 并發&#xff1a;在同一時刻&#xff0c;有多個指令在單個CPU上交替執行 并行&#xff1a;在同一時刻&#xff0c;有多個指令在多個CPU上同時執行 二、為什么有…