Infinite đệ quy [sửa]
Bài chi tiết: đệ quy Infinite
Nguyên nhân phổ biến nhất của stack overflow là đệ quy quá sâu hoặc vô hạn. Ngôn ngữ như Đề án, trong đó thực hiện tối ưu hóa đuôi-gọi, cho phép đệ quy vô hạn của một cụ thể loại đuôi đệ quy để xảy ra mà không tràn stack. Điều này làm việc bởi vì đuôi-đệ quy các cuộc gọi không mất thêm ngăn xếp không gian [2]. Một ví dụ về đệ 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 bản thân , sử dụng thêm không gian trên stack mỗi lần, cho đến khi tràn ngăn xếp kết quả trong một lỗi phân khúc. [3] đệ quy rất sâu [sửa] Một hàm đệ quy mà chấm dứt trong lý thuyết nhưng gây ra một cuộc gọi stack tràn bộ đệm 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 chồng. Đây là luôn luôn có thể, bởi vì lớp các hàm đệ quy nguyên thủy là tương đương với các lớp học của LOOP chức năng tính toán. Hãy xem xét ví dụ sau đây trong C ++ - như giả: . Một hàm đệ quy nguyên thủy như một ở phía bên trái luôn luôn có thể được chuyển đổi thành một vòng lặp như ở phía bên phải void function (đối số) { if (condition) chức năng (argument.next) ; } stack.push (argument); trong khi {(stack.empty ()!) lập luận = stack.pop (); if (điều kiện) stack.push (argument.next); } stack biến rất lớn [sửa] Sự khác nguyên nhân chính của một stack overflow là kết quả của một nỗ lực để cấp phát bộ nhớ hơn trên stack hơn sẽ phù hợp, ví dụ bằng cách tạo ra các biến mảng địa phương quá lớn. Vì lý do này một số tác giả khuyên mảng lớn hơn một vài kilobyte nên được tự động phân bổ thay vì như là một biến địa phương [4]. Một ví dụ của một biến đống rất lớn trong C: int foo () { x đôi [1000000]; } Các mảng được khai báo tiêu thụ 8 megabyte 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 stack (được thiết lập bởi các thông số tạo thread hoặc giới hạn hệ điều hành), một chồng 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ì làm giảm kích thước ngăn xếp có hiệu quả của một chương trình nhất định. Ví dụ, cùng một chương trình đang chạy mà không có nhiều đề tài có thể làm việc tốt, nhưng ngay sau khi đ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 thread hơn một chương trình không có hỗ trợ luồng. Bởi vì hạt nhân nói chung là đa luồng, người mới để phát triển hạt nhân thường được khuyến khích sử dụng các thuật toán đệ quy hoặc bộ đệm ngăn xếp lớn. [5] .
đang được dịch, vui lòng đợi..