Câu trả lời:
Có lẽ bạn chỉ nhận được một ngăn xếp tràn ở đây. Mảng quá lớn để vừa với không gian địa chỉ ngăn xếp chương trình của bạn.
Nếu bạn phân bổ mảng trên heap, bạn sẽ ổn, giả sử máy của bạn có đủ bộ nhớ.
int* array = new int[1000000];
Nhưng hãy nhớ rằng điều này sẽ yêu cầu bạn đến delete[]
mảng. Một giải pháp tốt hơn sẽ là sử dụng std::vector<int>
và thay đổi kích thước của nó thành 1000000 phần tử.
Trong C hoặc C ++, các đối tượng cục bộ thường được phân bổ trên ngăn xếp. Bạn đang phân bổ một mảng lớn trên ngăn xếp, nhiều hơn ngăn xếp có thể xử lý, vì vậy bạn đang nhận được một stackoverflow.
Đừng phân bổ cục bộ trên stack, thay vào đó hãy sử dụng một số vị trí khác. Điều này có thể đạt được bằng cách làm cho đối tượng toàn cầu hoặc phân bổ nó trên heap toàn cầu . Các biến toàn cục đều ổn, nếu bạn không sử dụng từ bất kỳ đơn vị biên dịch nào khác. Để đảm bảo điều này không xảy ra do tai nạn, hãy thêm một bộ xác định lưu trữ tĩnh, nếu không thì chỉ cần sử dụng heap.
Điều này sẽ phân bổ trong phân khúc BSS, một phần của heap:
static int c[1000000];
int main()
{
cout << "done\n";
return 0;
}
Điều này sẽ phân bổ trong phân đoạn DATA, cũng là một phần của heap:
int c[1000000] = {};
int main()
{
cout << "done\n";
return 0;
}
Điều này sẽ phân bổ tại một số vị trí không xác định trong heap:
int main()
{
int* c = new int[1000000];
cout << "done\n";
return 0;
}
delete
ở mọi nơi bạn phân bổ new
. Nhưng nếu bạn chắc chắn rằng bạn chỉ cấp phát bộ nhớ một lần (như trong main) thì hoàn toàn không cần thiết - bộ nhớ được đảm bảo sẽ được giải phóng khi thoát khỏi main ngay cả khi không rõ ràng delete
.
Ngoài ra, nếu bạn đang chạy trong hầu hết các hệ thống UNIX & Linux, bạn có thể tạm thời tăng kích thước ngăn xếp bằng lệnh sau:
ulimit -s unlimited
Nhưng hãy cẩn thận, bộ nhớ là một nguồn tài nguyên hạn chế và với sức mạnh lớn sẽ có trách nhiệm lớn :)
Bởi vì bạn lưu trữ các mảng trong ngăn xếp. Bạn nên lưu trữ nó trong đống. Xem liên kết này để hiểu khái niệm của heap và stack.