Có một sự khác biệt giữa phân bổ mảng (tức là những người tạo ra với một biểu thức new[]
, như new double[s]
), mà kiếp phải được quản lý bởi các mã (thông qua delete[]
) và tuyên bố mảng, mà kiếp này được quản lý bởi họ phạm vi một mình:
int* p = new int[s]; // allocated array, p has type int*
int q[10]; // declared array, q has type int[10]
std::vector<int> u; // has member allocated array
std::array<int, 5> v; // has member declared array
Sự khác biệt không dựa trên stack/heap. Một mảng được khai báo có thể được đống phân bổ (ví dụ new array<int,5>
) hay không trên stack (ví dụ static double x[100];
)
Với một mảng phân bổ, kích thước không phải là một biểu hiện thường xuyên. Kích thước đơn giản sẽ được mã hóa vào khối bộ nhớ được cấp phát bởi bộ cấp phát bằng cách nào đó (ví dụ bốn byte hàng đầu trước khi dữ liệu thực tế bắt đầu) sao cho delete[]
tương ứng biết số lượng phần tử cần xóa.
Với tuyên bố mảng (hoặc không được phân bổ mảng, không có/etc new
/malloc
.), Kích thước phải & dao găm; được mã hóa thành loại, để destructor biết phải làm gì. Các chỉ được phép, khai mảng giữa các ý kiến:
T D[constant-expression_opt];
(nơi D
là một declarator đó có thể là một tên hoặc khai mảng khác, vv) mảng khai báo không giới hạn vào stack. Lưu ý rằng, để thêm nhầm lẫn, biểu thức hằng số là tùy chọn.
Mảng cung cấp nhiều nguồn gây nhầm lẫn trong C++.Các mảng được phân bổ và khai báo có các quy tắc kích thước khác nhau, các thực hành quản lý khác nhau, nhưng bạn có thể gán một T*
cho một trong hai và chúng được lập chỉ mục tương đương. Một mảng được phân bổ là một con trỏ (đó là tất cả những gì bạn nhận được), nhưng một mảng được khai báo phân rã thành con trỏ (nhưng là một mảng!).
& dagger; Lưu ý rằng có là một khái niệm về một mảng chiều dài biến (VLA). Ví dụ: gcc, hỗ trợ chúng dưới dạng tiện ích, nhưng chúng không phải là C++ chuẩn. Nó được đề xuất định kỳ mặc dù, và bạn có thể xem this question để biết thêm thông tin về chúng.
biểu thức liên tục là bắt buộc đối với các mảng trên ngăn xếp chứ không phải trên vùng heap. http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/ –
Đó là loại ngụ ý bởi phần còn lại của đoạn văn (nhưng nên được viết ra, theo ý kiến của tôi) rằng trích dẫn từ trang 9 đề cập đến * khai báo * của một mảng. – molbdnilo
@GillBates Nó không có gì để làm với nơi mảng được lưu trữ. Nếu mảng là một thành viên của một lớp và một thể hiện của lớp đó được cấp phát động, khai báo mảng vẫn yêu cầu kích thước biểu thức không đổi, mặc dù mảng thực tế là "trên heap". – molbdnilo