2017-09-22 21 views
-9

以下代碼行是否相同? Student *s = new Student[n]; and Student s[n]; 如果不是,那麼在C++編程語言中new和delete的功能是什麼?目標C++編程中的對象數組

+11

歡迎來到Stack Overflow!聽起來像你可以使用[良好的C++書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – NathanOliver

+1

也許dupe:https://stackoverflow.com/問題/ 6122091/whats-the-difference-pointer-to-an-array-vs-regular-array – NathanOliver

+3

***以下代碼行是否相同?***編號'Student s [n]'是非法的在C++中,除非'n'是編譯時間常量。一些C++編譯器有一個非標準擴展,當'n'不是編譯時間常量時,它允許編譯它。 – drescherjm

回答

1

Student *s = new Student[n]位於heap內存中,在運行時進行評估。你必須delete [] s手動刪除它,並s內容可能範圍

Student s[n]分配staticly,位於stack內存外使用,它並沒有真正的工作,你只能使用特定的編譯時間恆定,以取代n

+0

建議將堆和堆棧交換爲動態和自動。有時候,這種額外的抽象層面會造成所有差異。 – user4581301

1

在此聲明

Student *s = new Student[n]; 

有聲明的類型的Student *的指針。其大小通常等於48字節,具體取決於所使用的系統。

您可以檢查它的大小通過以下方式

std::cout << sizeof(s) << std::endl; 

該指針明確的動態分配的數組new Student[n]的第一個元素的地址初始化。這裏n可以是一個運行時計算表達式。

要知道動態創建的數組中有多少元素,您應該將表達式n中的值保存在某個變量中。

在此聲明

Student s[n]; 

有聲明的類型Student[n]的陣列或更精確的對象。 對象的大小等於n * sizeof(Student)。您可以檢查它的大小通過以下方式,因爲它已經在上面顯示

std::cout << sizeof(s) << std::endl; 

數組不明確的初始化。所以如果它有自動存儲時間,那麼它的元素具有不確定的值。表達式n應該是在編譯時評估的常量表達式。

可以確定的使用例如表達所述陣列的元件的數量sizeof(s)/sizeof(*s)

要考慮到除了極少數例外,例如用於我當在表達式中使用的sizeof操作者陣列指示符轉換爲指針其第一要素。