網站首頁 編程語言 正文
1、使用new申請內存
在某些情況下,程序只有在運行期間才能確定所需內存大小,此時應該使用new申請內存。申請成功的情況下會返回首地址,通過指向首地址的指針可以訪問申請的內存,使用new申請內存的的語法如下:
new 數據類型(初始化參數列表);
下面的例子定義了Duck類型的指針,并通過new申請內存,返回的地址賦值給指針,如下:
/// 1、定義目標類型的指針 Duck *pointerDuck; /// 2、使用new申請內存 pointerDuck = new Duck(666); /// 3、使用指針調用對象public成員 printf("%d \n", pointerDuck->getAge());
需要注意的是:new返回的是地址,所以需要預先定義目標類型的指針
2、使用delete釋放內存
通過new申請的內存必須通過delete才能釋放,如果不釋放就會導致“內存泄漏”,使用delete釋放內存的語法如下:
delete 指針名; /// 實例如下: delete pointerDuck;
此外,delete
語句執行時會調用對象的析構函數(對于自定義類型),同一內存空間只能被delete一次,如果內存空間被重復delete則會導致程序運行錯誤。
3、使用new申請內存時的初始值
按照對象是否具有構造函數,new申請內存時根據類型是否有構造函數分為下面兩種情況:
- 對于有構造函數的對象,
new
會執行相應的構造函數; - 對沒有構造函數的基本數據類型,如果在類型名后加()則使用0進行初始化,但是不能使用具體值進行初始化,類型名后不加()則不進行初始化而是隨機值;
下面是沒有構造函數的基本數據類型使用new的例子:
/// 類型名后無括號則隨機值? pointer = new int[3]; /// 類型名后有括號則使用0初始化 pointer = new int[3]();
4、使用new和delete申請和釋放數組空間
對于數組,使用new動態申請內存空間的語法如下:
new 數據類型[數組長度]; /// 如下 pointer = new int[3]();
使用delete釋放內存的語法如下:
delete[] 指針名; /// 如下 delete[] pointer;
5、用類封裝new申請和釋放的數組空間
使用new
申請數組,返回的地址作為指針的值。使用指針訪問數組存在越界的可能性,而且不便于數組功能的擴展。下面通過自定義類,來實現數組的元素的賦值和訪問等功能擴展,同時解決數組存在的訪問越界的問題,以及封裝數組空間的申請和釋放。下面分步驟分析整型數組的代碼編寫過程:
- (1)確定私有數據成員:數組大小
arraySize
和數組指針pointerInt需要聲明為私有數據成員; - (2)確定構造函數:構造函數需要通過數組大小arraySize,使用new申請對應長度的數組內存空間,并將返回的地址賦值給指針pointerInt;
- (3)確定析構函數:析構函數需要通過
delete
釋放pointerInt
申請的空間; - (4)確定get和set函數:get和set函數需要進行“越界檢查”,并完成取元素和設置元素值的功能;
下面是具體實現的代碼;
class ArrayOfInt { public: ? ? /// 構造函數中使用new申請數組空間 ?? ?ArrayOfInt(int size) :arraySize(size){ ?? ??? ?pointerInt = new int[arraySize](); ?? ?} ? ? /// 析構函數完成數組內存釋放 ?? ?~ArrayOfInt() { delete pointerInt; }; ? ?? ? ? /// set函數進行元素值的設置,并進行越界檢查 ?? ?void setElement(int index, int value) { ?? ??? ?assert(index >= 0 && index < arraySize); ?? ??? ?*(pointerInt + index)=value; ?? ?} ? ? /// get函數進行越界檢查并返回指定位置的元素值 ?? ?int getElement(int index) { ?? ??? ?assert(index >= 0 && index < arraySize); ?? ??? ?return *(pointerInt + index); ?? ?} private: ? ? /// 私有數據成員負責記錄數組長度和首地址 ?? ?int *pointerInt; ?? ?int arraySize; };
下面是使用這個數組的例子:
ArrayOfInt arrayOfInt(3); arrayOfInt.setElement(1, 666); printf("%d \n", arrayOfInt.getElement(1));
6、使用new申請多維數組
首先必須明確,基本類型的指針是不能用于二維或者更高維的數組的,下面定義的指針只能訪問一維數組:
int *pointer;
為了訪問n維數組,必須定義n-1維的指針數組:
int (*pointer)[2][3]; /// 第一維的[4]不是指針的維度 pointer = new int[4][2][3]();
原文鏈接:https://zhuanlan.zhihu.com/p/104875074
相關推薦
- 2022-10-12 Docker部署golang環境詳解_docker
- 2023-01-10 SpringEvent優雅解耦時連續兩個bug的解決方案_Golang
- 2022-06-07 Selenium瀏覽器自動化如何上傳文件_python
- 2022-04-03 C++內嵌匯編示例詳解_C 語言
- 2023-05-29 Postgresql數據庫角色創建登錄詳解_PostgreSQL
- 2024-02-16 springboot開啟mybatis二級緩存
- 2022-06-22 android使用intent傳遞參數實現乘法計算_Android
- 2021-11-08 C++繼承模式詳解_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支