2011-10-10 17 views
7

Tôi được thông báo rằng mọi phương thức đều có kích thước 1mb. Vì vậy, tôi giả định rằng khởi tạo 256 giá trị số nguyên trong một phương pháp sẽ gây ra một StackOverflowException. Tôi đã thử mã đó, nhưng không có ngoại lệ nào được ném ra.cách cố ý kích hoạt StackOverflowException mà không sử dụng đệ quy?

Vì vậy, làm thế nào để cố tình kích hoạt một StackOverflowException mà không sử dụng đệ quy?

+6

256 * 4 byte = 1kb, không 1mb –

+3

256 số nguyên là = 256 * 4 byte = 1024 byte = 1 kb, không phải 1 MB. Do đó, bạn sẽ cần 256.000 số nguyên. Và tôi thậm chí sẽ không cố gắng viết một mã với 256.000 tờ khai. (chỉnh sửa: và Marc Gravells là luôn luôn nhanh hơn) :) –

+0

oh, xấu của tôi, xin lỗi. – CuiPengFei

Trả lời

5

Tôi sẽ thêm một phương pháp khác :-)

unsafe struct FixedBufferExample 
{ 
    public fixed byte Buffer[128 * 1024]; // This is a fixed buffer. 
} 

Bây giờ cấu trúc này là 128kb :-) Nếu bạn khai báo một biến địa phương (của một phương pháp mà không sử dụng năng suất hoặc async) kiểu FixedBufferExample nó nên sử dụng 128kb ngăn xếp. Bạn có thể sử dụng hết stack nhanh chóng.

+1

aye, điều đó sẽ làm điều đó; p –

19

sử dụng

throw new StackOverflowException(); 
+0

+1. Luôn sử dụng cách tiếp cận đơn giản nhất để đạt được kết quả sau? :) –

+0

có - một cái gì đó như thế :-) – Yahia

7

stackalloc có lẽ là cách dễ nhất (giả sử bạn muốn runtime để ném lỗi, chứ không phải là chính mình):

unsafe void Boom() 
    { 
     int* data = stackalloc int[512 * 1024]; // 2MB 
    } 
+1

là có bất kỳ sự khác biệt nếu được sử dụng trên hệ thống 64 Bit? Ngăn xếp có lớn hơn không? – Yahia

+0

@Yahia câu hỏi hay, p –

-2

Gọi tài sản của bạn trong tài sản của bạn (nó là đệ quy, nhưng nó rất phổ biến mà tôi đã phải đề cập đến nó):

int MyProperty 
{ 
    set { MyProperty = value; } 
} 
+3

ông đã đề cập ** kích hoạt một StackOverflowException mà không sử dụng đệ quy **, vì vậy làm thế nào con số này ở đây? – V4Vendetta

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