簡體   English   中英

靜態和動態分配僅存儲一個int的指針

[英]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派生的另一個異常)。

為什么在大多數情況下不應使用第二個指針

內存管理是一個很難的話題。 主要的提示,我可以給你,是為了避免newdelete像瘟疫一樣。 只要您能夠以任何其他標准方式執行某項操作,就應該首選它。

例如,在這種情況下,我想出證明這種技術合理性的唯一原因是擁有一個可選參數。 您可以並且應該使用std::optional代替。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM