【C++】動態內存分配(關于構造與析構函數的調用)動態數組類 動態創建多維數組 知識點+代碼學習記錄

一.動態內存分配相關知識點

1.堆和棧內存

堆內存:動態分配的內存位于堆中,它不受作用域限制,由程序員控制其生命周期。

棧內存:局部變量和函數參數等自動分配的內存位于棧中,由編譯器自動管理。

2.newdelete操作符

new:用于在堆上分配內存,可以分配單個對象或對象數組。

delete:用于釋放由new分配的單個對象的內存。

delete[]:用于釋放由new[]分配的對象數組的內存。

3.內存泄漏

如果忘記使用deletedelete[]釋放內存,可能會導致內存泄漏,即程序占用的內存不會被釋放,直到程序終止。

4.構造函數和析構函數

當使用new創建對象時,相應的構造函數會被調用。

使用deletedelete[]釋放對象時,相應的析構函數會被調用,用于清理對象占用的資源。

5.智能指針

C++11及更高版本引入了智能指針(如std::unique_ptr,?std::shared_ptr),它們可以自動管理內存,避免內存泄漏。

6.mallocfree函數

這些是C風格的動態內存分配和釋放函數,但在C++中推薦使用newdelete,因為它們能夠調用構造函數和析構函數。

7.動態數組分配

可以使用new T[n]來分配一個包含n個T類型的對象的數組,并使用delete[]來釋放這個數組。

二.關于構造與析構函數的調用代碼實例

#include<iostream>using namespace std;
class Point {
public:Point() :x(10), y(10) {cout << "調用Point給出的默認構造函數" << endl;}Point(int x, int y) :x(x), y(y) {cout << "調用Point含參構造函數" << endl;}~Point() {cout << "調用Point析構函數" << endl;}void show() const {cout << x << "  " << y << endl;}
private:int x, y;
};class Point2 {
public:~Point2() {cout << "調用Point2析構函數" << endl;}void show() const{cout << x << "  " << y << endl;}
private:int x, y;
};int main() {cout << "不給出參數列表" << endl;//new動態內存分配,申請內存,成功則返回一個指向新分配內存的首地址(申請失敗出現異常)Point* ptr1 = new Point;(*ptr1).show();//防止“內存泄漏”,但是delete是“釋放指針所指向的內存空間,是刪除new對象,而不是刪除指針本身”//調用new建立對象的析構函數delete ptr1;//用戶給出了默認構造函數//不能重復聲明指針ptr1 = new Point();(*ptr1).show();delete ptr1;cout << "給出參數列表" << endl;Point* ptr2 = new Point(1, 4);(*ptr2).show();delete ptr2;//用戶沒給出默認構造函數,調用系統的(此時類里面不能有用戶給出的無參數或有參數構造函數)//無括號時,單純調用默認構造函數,不初始化Point2* ptr3 = new Point2;ptr3->show();delete ptr3;//有括號時,在調用默認構造函數時,會自動初始化元素為0,并且遞歸初始化ptr3 = new Point2();ptr3->show();delete ptr3;cout << "------1------" << endl;//動態創建對象數組//ptr相當與一個數組名,數組中的每個元素都是指向Point類的指針Point* ptr = new Point[2];ptr[0].show();ptr[1].show();//注意delete格式delete[]ptr;
}
//終端輸出
不給出參數列表
調用Point給出的默認構造函數
10  10
調用Point析構函數
調用Point給出的默認構造函數
10  10
調用Point析構函數
給出參數列表
調用Point含參構造函數
1  4
調用Point析構函數
-842150451  -842150451
調用Point2析構函數
0  0
調用Point2析構函數
------1------
調用Point給出的默認構造函數
調用Point給出的默認構造函數
10  10
10  10
調用Point析構函數
調用Point析構函數

三.動態數組類

#include<iostream>
//擁有“assert”“斷言”:
//可以判斷一個表達式的值是否為true,如果不為true,程序會終止并且報告錯誤地點
#include<cassert>
using namespace std;
class Point {
public:Point() :x(10), y(10) {cout << "調用Point給出的默認構造函數" << endl;}Point(int x, int y) :x(x), y(y) {cout << "調用Point含參構造函數" << endl;}~Point() {cout << "調用Point析構函數" << endl;}void show() const {cout << x << "  " << y << endl;}
private:int x, y;
};
//動態數組類
class ArrayOfPoints {
private:Point* points;  //指向動態數組首地址int size;    //數組大小
public:ArrayOfPoints(int size) :size(size) {points = new Point[size];}~ArrayOfPoints() {cout << "Deleting..." << endl;delete[]points;}//獲取下標為Index的元素//返回引用可以對該下標元素進行修改Point& element(int index) {assert(index >= 0 && index < size);    //下標越界程序立即停止return points[index];}
};int main() {int count;cin >> count;//創建對象數組ArrayOfPoints point(count);//通過類安全的訪問數組成員point.element(2).show();//point.element(10).show();cout << "Ending..." << endl;return 0;
}

四.動態創建多維數組

#include<iostream>
using namespace std;
int main() {//cp是一個指向一個二維的9x8的數組的指針,定義了一個cp[8]float(*cp)[9][8] = new float[8][9][8];for (int i = 0; i < 8; i++) {for (int j = 0; j < 9; j++) {for (int k = 0; k < 8; k++) {//以指針形式數組元素*(*(*(cp + i) + j) + k) = static_cast<float>(i * 100 + j * 10 + k);}}}for (int i = 0; i < 8; i++) {for (int j = 0; j < 9; j++) {for (int k = 0; k < 8; k++) {//將指針cp作為數組名使用,訪問數組下標cout << cp[i][j][k] << " ";}cout << endl;}cout << endl;}// 注意刪除格式delete[] cp;return 0;
}

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

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

相關文章

性能測試(2)

jmeter參數化 loadrunner Jmeter IP欺騙&#xff0c;也稱為IP欺詐&#xff0c;是指通過偽裝、篡改IP地址的方式&#xff0c;進行網絡攻擊或欺騙行為。這種行為可能會導致網絡安全問題&#xff0c;包括身份盜竊、數據泄露、DDoS攻擊等。為了保護自己的網絡安全&#xff0c;用戶…

MySQL-表的約束

文章目錄 一、空屬性二、默認值三、zerofill四、列描述五、主鍵刪除主鍵追加主鍵復合主鍵根據主鍵快速索引 六、自增長last_insert_id() 七、唯一鍵八、外鍵class表&#xff08;主表&#xff09;student表&#xff08;從表&#xff09; 一、空屬性 之前我們將表的機構&#xff…

單例模式java

并發的有序性會導致返回空指針 class A{private static volatil A a;private A(){}public A getInstance(){if(anull){synchronized(A.class){if(anull)anew A();}}return a; }anew A();這條語句&#xff0c;他需要&#xff1a;開辟空間&#xff0c;初始化空間&#xff0c;指針…

python熱門面試題三

面試題1&#xff1a;Python中的列表推導式是什么&#xff1f;請給出一個例子。 回答&#xff1a; 列表推導式&#xff08;List Comprehension&#xff09;是Python中一種非常強大且簡潔的構建列表的工具。它允許你通過一個表達式來創建一個新的列表&#xff0c;這個表達式定義…

無顯卡也可以玩大模型-MiniGPT-4篇

MiniGPT-4學習 1.Colab上部署MiniGPT-42.論文摘要3.模型架構4.模型訓練5.總結 1.Colab上部署MiniGPT-4 代碼&#xff1a; https://github.com/Czi24/Awesome-MLLM-LLM-Colab/blob/master/MLLM/MiniGPT-4-colab/MiniGPT-4.md 2.論文摘要 最近的 GPT-4 展示了非凡的多模式能力&…

【設計模式之美】【建造型】工廠模式:通過面向接口編程思路,串起業務流程

文章目錄 一. 簡單工廠&#xff08;Simple Factory&#xff09;第一種簡單工廠&#xff1a;面向接口編程與工廠類&#xff1a;劃分功能職責第二種&#xff1a;單例簡單工廠&#xff1a;節省內存和對象創建的時間 二. 工廠方法&#xff08;Factory Method&#xff09;&#xff1…

文心一言:如何備考軟考架構師

提問&#xff1a;軟考高級:架構師指導&#xff0c;有哪些考點、重點考點有哪些&#xff1f;需要如何備考&#xff1f;案例分析題如何做&#xff1f;論文如何寫&#xff1f; 文心一言回答1700字如下&#xff1a; 針對軟考高級架構師的考試&#xff0c;以下是對考點、重點考點、備…

DiffusionModel-Transformer知識回顧

論文鏈接&#xff1a; Attention Is All You Need CNN vs RNN vs Transformer CNN&#xff08;卷積神經網絡&#xff09; 特點&#xff1a; 局部連接&#xff1a;每個卷積神經元只與輸入數據的局部區域連接&#xff0c;這有助于捕捉局部特征。權重共享&#xff1a;卷積核的權重…

Android筆記:Constructor (xxx) has been changed after generation.

遇到此報錯時&#xff0c;onstructor (xxx) has been changed after generation.是因為修改了實體類字段后什么都不修改的話就會報這個錯 這條信息是關于代碼生成和代碼變更的警告。當你使用某些工具&#xff08;如注解處理器、代碼生成庫等&#xff09;來自動生成代碼時&…

運行在Linux上的程序越來越慢的排查思路

1、通過free -h 排查內存使用情況&#xff0c;是否內存滿了 2、通過df -h 排查磁盤的使用情況&#xff0c;磁盤是否沒有空間了 3、檢查系統資源配置情況&#xff0c;比如使用ulimit -a檢查當前會話的資源限制&#xff0c;如最大文件數、打開文件描述符數等&#xff0c;看是否…

清華計算幾何-ConvexHull(凸包)-求極點InTriangle/ToLeft Test

ConvexHull(凸包) 凸包是什么 凸包是計算幾何一個非常基礎核心的概念。我理解的凸包就是給定一個點集合, 最外圍的點的包圍體就是凸包。如下所示: 極點(ExtremityPoint) 給定的點集合中, 如果一個點存在一條直線, 讓其他所有點都在于該直線的同一側, 則該點為極點。 非極點 …

如何理解electron 的預加載腳本

在 Electron 應用中,預加載腳本(Preload Script)是一個非常重要的概念,它允許你在渲染進程(web 頁面)和主進程之間創建一個安全的橋梁。預加載腳本運行在 Node.js 環境中,但位于渲染進程的一個單獨的上下文中,這意味著它可以訪問 Node.js 的 API,但無法直接訪問 DOM。…

JavaScript進階(7) ----構造函數和原型對象

目錄 構造函數 prototype 定義&#xff1a; 使用場景&#xff1a; constructor 使用場景&#xff1a; 原型proto 原型鏈 定義 特點 instanceof 運算符 原型繼承的基本概念 在JavaScript中&#xff0c;構造函數和原型是面向對象編程的核心概念&#xff0c;它們共同構…

海康工業相機驅動

1.新建基于對話框的MFC程序&#xff0c;界面布局如下 2.修改控件ID&#xff0c;為控件綁定變量 3.創建全局變量&#xff0c;構造函數中初始化變量&#xff0c;初始化對話框界面&#xff0c;補齊各控件按鈕響應函數 全文程序如下&#xff1a; // MFC_GrabimageDlg.h : 頭文件 /…

【動態規劃Ⅰ】斐波那契、爬樓梯、楊輝三角

動態規劃—斐波那契系列 什么是動態規劃斐波那契數組相關題目509. 斐波那契數 Easy1137. 第 N 個泰波那契數 Easy 楊輝三角118. 楊輝三角 Easy 爬樓梯相關題目70. 爬樓梯 Easy746. 使用最小花費爬樓梯 Easy 什么是動態規劃 動態規劃是一種通過將原問題分解為相對簡單的子問題來…

linux下解壓命令

在Linux下&#xff0c;解壓縮文件通常涉及多種命令&#xff0c;具體取決于文件的壓縮格式。以下是一些常用的解壓縮命令&#xff1a; tar.gz / .tgz 如果文件擴展名為 .tar.gz 或 .tgz&#xff0c;你可以使用 tar 命令來解壓縮&#xff1a; tar -xzf filename.tar.gz這里的 -x …

近期幾首小詩匯總-生活~卷

生活 為生活飄零&#xff0c;風雨都不阻 路見盲人艱&#xff0c;為她心點燈 賀中科大家長論壇成立十五周年 科學家園有喜賀 園外丑漢翹望中 曾一學子入我科 正育科二盼長大 憧憬也能入此家 與科學家論短長 園外翹首聽高論 發現有隙入此壇 竟然也能注冊成 入園瀏覽惶然立 此貼…

系統架構的基礎:定義、原則與發展歷程

目錄 1. 系統架構的定義 2. 系統架構的基本組成部分 2.1 架構層次 2.2 架構視圖 2.3 架構原則 3. 系統架構的發展歷程 3.1 初期階段:單體架構(Monolithic Architecture) 3.2 面向對象和組件化階段 3.3 客戶端-服務器架構(Client-Server Architecture) 3.4 三層架…

在 Linux 上使用 lspci 命令查看 PCI 總線硬件設備信息

lspci 命令用于顯示 Linux 系統上的設備和驅動程序 當在個人電腦或服務器上運行 Linux 時&#xff0c;有時需要識別該系統中的硬件。lspci 命令用于顯示連接到 PCI 總線的所有設備&#xff0c;從而滿足上述需求。該命令由 pciutils 包提供&#xff0c;可用于各種基于 Linux 和…

JAVA中的回溯算法解空間樹,八皇后問題以及騎士游歷問題超詳解

1.回溯算法的概念 回溯算法顧名思義就是有回溯的算法 回溯算法實際上一個類似枚舉的搜索嘗試過程&#xff0c;主要是在搜索嘗試過程中尋找問題的解&#xff0c;當發現已不滿足求解條件時&#xff0c;就“回溯”返回&#xff0c;嘗試別的路徑。回溯法是一種選優搜索法&#xff…