2017-01-30 143 views
1

這兩個比他們的持續時間有什麼不同嗎?爲什麼或什麼時候用指針聲明一個int?

int ptr; 
int *ptr = new int; 

我理解指針的概念,但是我沒有看到用於爲指針賦予int的很多用途。

+0

應該用指針聲明什麼,爲什麼? – lisyarus

+0

你使用它們的方式會有所不同;指針必須由'* ptr'使用。 – Bernard

+1

一個在棧上,後者在堆上。您必須刪除堆上的內容才能泄漏內存。 – Rishi

回答

3

如果您不需要其創建範圍外的對象,則可以在堆棧上使用對象。

實施例:

int foo(int in) 
{ 
    int i = in + 2; 
    return i; 
} 

i不需要外部foo。因此,你在棧上創建一個對象並返回它的值。

如果您需要超出創建範圍的對象,則可以使用堆上的對象。

int* foo(int in) 
{ 
    int* ip = new int(in + 2); 
    return ip; 
} 

,爲了從foo返回ip點,預計通過調用函數中使用的指針。因此,您需要在堆上創建一個對象並將其返回。

這是差異的概念方面。通常,如果您正在討論int,則不需要使用堆中的對象。當你需要返回一個數組時,差異就變得很重要。

int* foo() 
{ 
    int arr[] = {1, 2, 3, 4}; 
    return arr; 
} 

該函數將是一個問題,因爲它返回一個函數返回後無效的指針。

int* foo() 
{ 
    int* arr = new int[4]{1, 2, 3, 4}; 
    return arr; 
} 

這將工作,因爲返回的指針即使在函數返回後也會指向有效的對象。調用函數必須負責釋放內存。

+0

謝謝,我現在明白了。 – Crally

-1

從性能的角度可以看出差異。

考慮最壞的情況場景:

int ptr;在這種情況下,所有需要的內存將在同一頁面上。

int *ptr = new int;在這種情況下ptr的地址可以是一個頁面,並且它指向可以是不同的頁這可能導致一個頁面故障而間接地即*ptr訪問存儲器上的存儲器上。

+0

Plz解釋了這個問題。 – sameerkn

+0

(不是我的投票)這沒有錯,只是無關緊要,而且對初學者有誤導作用。 – MSalters

相關問題