Vô hạn đệ quy [sửa]Bài chi tiết: vô hạn đệ quyNguyên nhân phổ biến nhất của ngăn xếp tràn là quá sâu hoặc vô hạn đệ quy. Ngôn ngữ như đề án, mà thực hiện cuộc gọi đuôi tối ưu hóa, cho phép các đệ quy vô hạn của một loại cụ thể-đệ quy đuôi — xảy ra mà không ngăn xếp tràn. Công trình này bởi vì đệ quy đuôi cuộc gọi không mất không gian bổ sung ngăn xếp.[2]Một ví dụ về các đệ quy vô hạn trong C.int foo() { trở lại foo();}Hàm foo, khi nó được gọi, tiếp tục gọi riêng của mình, bằng cách sử dụng không gian bổ sung vào ngăn xếp mỗi lần, cho đến khi ngăn xếp tràn dẫn đến một lỗi phân khúc.[3]Rất sâu đệ quy [sửa]Một chức năng đệ quy mà chấm dứt trong lý thuyết nhưng gây ra một lỗi tràn bộ đệm gọi ngăn xếp trong thực tế có thể được cố định bằng cách chuyển đổi đệ quy vào một vòng lặp và lưu trữ các đối số chức năng trong một ngăn xếp. Điều này luôn luôn có thể, bởi vì lớp nguyên thủy đệ quy chức năng là tương đương với các lớp học chức năng computable LOOP. Hãy xem xét ví dụ sau trong C++ giống như mã giả:Một chức năng đệ quy nguyên thủy như một bên trái có thể luôn luôn được chuyển vào một vòng lặp như ở phía bên phải.vô hiệu chức năng (đối số) { Nếu (điều kiện) chức năng (argument.next); }stack.Push(argument);trong khi (! stack.empty()) {} đối số = stack.pop(); Nếu (điều kiện) stack.Push(argument.Next);}Rất lớn ngăn xếp biến [sửa]Nguyên nhân chính của một ngăn xếp tràn kết quả từ một nỗ lực để cấp phát bộ nhớ thêm vào ngăn xếp hơn sẽ phù hợp, ví dụ bằng cách tạo ra các biến địa phương mảng quá lớn. Vì lý do này, một số tác giả đề nghị rằng mảng lớn hơn một vài kilobyte nên được cấp phát động thay vì như là một biến địa phương.[4]Một ví dụ về một biến rất lớn ngăn xếp trong C:int foo() { đôi x [1000000];}Các mảng tuyên bố tiêu thụ 8 MB dữ liệu (giả sử mỗi đôi là 8 byte); Nếu điều này là bộ nhớ nhiều hơn là có sẵn trên ngăn xếp (như được trình bày bởi chủ đề tạo ra tham số hoặc giới hạn hệ điều hành), một ngăn xếp tràn sẽ xảy ra.Ngăn xếp tràn được thực hiện tồi tệ hơn bởi bất cứ điều gì mà làm giảm kích thước ngăn xếp hiệu quả của một chương trình. Ví dụ, cùng một chương trình đang được chạy mà không có nhiều chủ đề có thể làm việc tốt, nhưng càng sớm càng đa luồng được kích hoạt chương trình sẽ sụp đổ. Điều này là bởi vì hầu hết các chương trình với chủ đề có ít không gian ngăn xếp cho mỗi chủ đề hơn một chương trình không có hỗ trợ luồng. Vì hạt nhân được thường đa luồng, mọi người mới để phát triển hạt nhân được thường khuyến khích sử dụng thuật toán đệ quy hoặc lớn ngăn xếp bộ đệm.[5].
đang được dịch, vui lòng đợi..