2009-03-24 28 views
7

Tôi có một mảng rất lớn phải dài 262144 phần tử (và có khả năng lớn hơn nhiều trong tương lai). Tôi đã cố gắng bố trí các mảng trên stack như vậy:Làm cách nào để tạo một mảng trong C++ trên heap thay vì ngăn xếp?

#define SIZE 262144 
int myArray[SIZE]; 

Tuy nhiên, dường như khi tôi cố gắng và thêm yếu tố qua một điểm nhất định, các giá trị khác nhau khi tôi cố gắng để truy cập chúng. Tôi hiểu rằng điều này là bởi vì chỉ có một số lượng hữu hạn của bộ nhớ trên stack, như trái ngược với đống có nhiều bộ nhớ hơn.

Tôi đã thử sau đây mà không có nhiều may mắn (không biên dịch):

#define SIZE 262144 
int *myArray[SIZE] = new int[SIZE]; 

Và sau đó tôi xem là sử dụng malloc, nhưng tôi đã tự hỏi nếu có một C++ nhiều cách như làm điều này ...

#define SIZE 262144 
int *myArray = (int*)malloc(sizeof(int) * SIZE); 

Tôi có nên chỉ cần đi với malloc?

+0

thay đổi "myArray [SIZE]" thành "myArray" trong khối thứ hai của mã. – eduffy

+3

Vijay, đây không phải là câu hỏi về việc học cú pháp. Tùy chọn đầu tiên là chính xác, ngoại trừ kích thước và tùy chọn thứ hai là một lỗi đủ phổ biến mà nó đáng được đề cập đến. Ngoài ra, trang web này cũng không giúp ích gì khi ai đó không hiểu cú pháp? –

+2

Để có một lỗi cú pháp trong một câu hỏi không làm cho nó là một câu hỏi xấu. –

Trả lời

38

Bạn sẽ muốn sử dụng mới như ví dụ:

int *myArray = new int[SIZE]; 

Tôi cũng sẽ đề cập đến phía bên kia của này, chỉ trong trường hợp ....

Kể từ khi đang chuyển đổi của bạn từ ngăn xếp để heap, bạn cũng sẽ cần phải làm sạch bộ nhớ này lên khi bạn đang thực hiện với nó.Trên stack, bộ nhớ sẽ tự động dọn dẹp, nhưng trên heap, bạn sẽ cần phải xóa nó, và từ một mảng của nó, bạn nên sử dụng:

delete [] myArray; 
+0

Tuyệt vời ở trên và vượt ra ngoài thông tin. +1 –

1

Khi số lượng không nhất thiết phải biết đến tại thời gian biên dịch, loại là một con trỏ:

int *myArray = new int[262144]; 
+0

Cảm ơn biên dịch đó. Tuy nhiên, ngay cả sau khi sử dụng bộ nhớ heap, tôi vẫn có số ngẫu nhiên ở cuối mảng của tôi sau khi gán. Ý tưởng nào? –

+0

Tôi không biết. Đăng cách bạn gán vào câu hỏi, vì vậy tất cả chúng ta đều có thể xem xét nó –

1

new phân bổ trên heap.

#define SIZE 262144 
int * myArray = new int[SIZE]; 
0

Lý do lần thử đầu tiên không hiệu quả là cú pháp không chính xác. Hãy thử điều này:

int *myArray = new int[SIZE]; 
1

Tôi tin

#define SIZE 262144 
int *myArray[SIZE] = new int[262144]; 

nên

#define SIZE 262144 
int *myArray = new int[262144]; 

hoặc tốt hơn chưa

#define SIZE 262144 
int *myArray = new int[SIZE]; 
0

cú pháp của bạn cho việc sử dụng new đã sai, nó phải là:

int *myArray = new int[262144]; 

bạn chỉ cần đặt kích thước ở bên phải của bài tập.

Tuy nhiên, nếu bạn đang sử dụng C++, bạn có thể muốn xem bằng cách sử dụng std::vector (bạn sẽ có) hoặc một cái gì đó như boost::scoped_array để làm cho việc quản lý bộ nhớ dễ dàng hơn một chút.

+0

std :: vector nên được đề xuất, vì đó là * thực sự * một phần của C++ và không chỉ là "bổ sung khá tốt" cho ngôn ngữ. – Tom

+0

Đó là một điểm rất tốt – Wilka

20

C++ cách hơn để làm điều đó là để sử dụng vector. Sau đó, bạn không phải lo lắng về việc xóa bộ nhớ khi bạn đã hoàn tất; vector sẽ làm điều đó cho bạn.

#include <vector> 

std::vector<int> v(262144); 
+0

+1, nhưng tăng :: shared_array * có thể * phù hợp hơn cho các mảng có kích thước siêu tùy thuộc vào trường hợp sử dụng. – Functastic

+0

Có vẻ như vector là hoàn hảo cho trường hợp của anh ta. Nếu một mảng có thể đã làm việc trên ngăn xếp, một vectơ sẽ thay thế mảng đó tốt. –

+0

Vâng tôi đã xem xét véc tơ ... Tôi chỉ tìm ra mảng sẽ là trí nhớ tốt hơn, nhưng suy nghĩ về nó, điều đó không có ý nghĩa ... vector thậm chí có thể có nhiều bộ nhớ hiệu quả hơn, đúng không? –

Các vấn đề liên quan