[英]Static vs dynamic allocation of a pointer which stores just one int
我想知道為什么我需要第二個版本?
int* p; // version 1
int* p = new int; // version 2
在第一個版本中,指針沒有指向任何東西,它是未定義的。 版本2分配了內存,並將p指向該新內存。 您不是在為指針本身分配空間,而是為指針所指向的內存。 (在兩個版本中,指針本身都在堆棧上)
假設代碼出現在函數中:
第一個定義了一個int*
類型的局部變量(即一個指針)。 該變量未初始化,這意味着指針沒有值。 它沒有指向任何東西。 它幾乎沒有用,您唯一可以做的就是為其分配一個指針值[*]。 因此,您自己想:“我可以推遲定義變量,直到我有一個值可以分配給它嗎?”
第二個定義了一個int*
類型的局部變量(也就是一個指針),並且還動態分配了一個int
類型的對象並將該對象的地址分配給該指針變量。 因此,指針指向int
。
動態分配一個int
幾乎總是一個壞主意。 在您至少擁有一個int
和訪問它的方式的意義上,它不是沒有用的。 但是您為自己制造了一個問題,因為您必須跟蹤它並釋放它。
[*]使用未初始化的int*
變量可以做的其他事情:獲取變量的地址; 將其綁定到int*&
類型的引用 將變量的地址轉換為char*
並一次檢查一個字節的內存,以查看您的實現已將該未初始化變量放入其中。 沒有什么令人興奮的,而且至關重要的是,沒有任何涉及任何int
對象的事物,因為您沒有。
第一個指針,聲明為:
int* p;
只分配存儲指向int
的指針所需的內存。 實際大小由實現定義。 根據8.5 / 12, p
對象包含的內容不確定 :
如果未為對象指定初始化程序,則該對象將被默認初始化。 當獲得具有自動或動態存儲持續時間的對象的存儲時,該對象具有不確定的值,並且如果未對該對象執行任何初始化,則該對象將保留不確定的值,直到替換該值為止(5.17)。
這意味着取消引用指針將導致未定義的行為 。
第二個指針,聲明為:
int* p = new int;
動態分配一個int
。 這意味着對象的生存期將在程序退出時終止(不確定標准是否真正實施了此操作,但是我很確定一旦程序執行完畢,底層操作系統將收回未使用的內存)或當您釋放它時。
可以安全地取消引用該指針,除非operator new
未能分配內存(在這種情況下,它將拋出std::bad_alloc
或從C ++ 11開始拋出從std::bad_alloc
派生的另一個異常)。
內存管理是一個很難的話題。 主要的提示,我可以給你,是為了避免new
和delete
像瘟疫一樣。 只要您能夠以任何其他標准方式執行某項操作,就應該首選它。
例如,在這種情況下,我想出證明這種技術合理性的唯一原因是擁有一個可選參數。 您可以並且應該使用std::optional
代替。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.