2014-12-22 120 views
-4

我有兩個性質疑關於新的運營商使用新的運營商

1)分配大小

int a[20]; 

上述語句中的陣列的

int a=new int[20]; 

該語句在分配尺寸20的存儲器也做同樣的事情,那麼爲什麼我應該去與新的運營商 時,這是很容易分配的大小由陣列

2)
那爲什麼new操作符總是被用來分配一樣大小隻有指針變量

int *p; 
    p=new int[100]; 

它不用於分配大小的普通變量

+1

如果您不知道預先分配的大小,該怎麼辦?另外,當尺寸很大時,會出現堆棧溢出問題。 –

+0

首先,代碼不正確:int [] a = new int [20]。然後,你必須研究很多之前問這樣一個壞問題... – LPs

+1

@LPs:'int [] a'是錯誤的,它需要是'int * a'代替。 –

回答

1

INT一個[20];

在堆棧上分配,在編譯時必須知道大小。

int * a = new int [20];

分配在堆上,大小不需要在編譯時知道,可以在運行時指定。

0

new [20]創建「動態」內存(在堆上)。 [20]在堆棧上創建內存。

新的,你可以做這樣的東西:

std::vector<int*> my_std_vector; 

for(int i=0; i < atoi(argv[1]); ++i) { 
    int *my_int = new int[20]; 
    my_std_vector.push_back(my_int); 
} 

一些例子:http://www.cplusplus.com/reference/new/operator%20new%5B%5D/

0

有一些問題,像這樣使用數組的定義。

int a[20]; 

該語句根據使用語句的上下文將數組分配到靜態內存或堆棧中。通常堆棧的大小是有限的。因此,對於在堆棧中定義的大型數組,程序可能會崩潰。

另一個問題是,C++中數組的大小應該是編譯時常量表達式。如果要在運行時確定數組的大小,那麼你必須在你的榜樣使用新的運營商,如果它是正確寫入:

size_t n = 20; 

int *a = new int[n]; 

還有另一個問題。例如,您可能不會從函數返回數組,您可能不會返回指向本地數組的第一個元素的指針。所以唯一的方法是返回一個指向動態分配數組的指針或將數組包裝在結構中。但最後一種方式對於大型陣列來說效率不高。

運算符new可用於分配單個對象。例如

int *p = int(10); 

當您需要分配類對象時,最常使用單個對象的新運算符。

1
int a[20]; 

在堆棧上分配內存。

int *a=new int[20]; 

在堆上分配內存。

堆了堆的優勢: -

你得到控制內存即是你,當你不需要內存,因此刪除它不同於堆棧存儲器誰都會選擇。

堆了堆的缺點: -

訪問堆內存是位比訪問堆棧內存慢,如果你錯過刪除對內存比這將導致內存泄漏。

+0

'int a = new int [20];'是不正確的,因爲a不是指針 –