استاد چیه گلپسر! سجاد صدام کنبرای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Speed Racer برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
اون استک ای که در فیلم گفتم ، یه کم متفاوت هه . البته خیلی بی راه نیست ولی یه کم (نه خیلی) داستان اش متفاوت هه . اون موقع چون تجربه ی کافی نداشتم ، دقیق نمیدونستم .
ببین ، اول اینکه استک ، حافظه ی جداگانه ای نیست (که توی فیلم ، به عنوان یه حافظه با حجم کمتر کشیده بودم) .
استک ، یک حافظه ای هه که هر متد (یا عضو یا کلا هر چیزی که نیازمند حافظه باشه) که در یک برنامه فراخونی میشه ، براش در نظر گرفته میشه .
از اون طرف هم موقع خوندن اطلاعات ، از آخرین حافظه شروع به خوندن میکنه .
دقیقا مثل گذاشتن یه گلوله توی خشاب که موقع شلیک ، از آخرین گلوله ای که در خشاب گذاشته شد ، برای اولین گلوله ی شلیک شده مورد استفاده قرار میگیره .
در متد Button4_Click در کد زیر ، یک break point بذارید و کد را اجرا کنید :
رویداد مربوط به کلیک دکمه ی Button4_Click را اجرا کنید (اون دکمه ای که به این رویداد متصل کردید را کلیک کنید) (شکل زیر) :کد:private void Button4_Click(object sender, RoutedEventArgs e) { this.Test1(); } private void Test1() { this.Test2(); int a = 1; } private void Test2() { this.Test3(); int a = 2; } private void Test3() { int a = 3; }
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
همونطور که در بخش call stack میبینی (بخش پایین ، سمت راست) (دقت کن که این قسمت ، شامل 3 پنجره ی call stack و exception settings و immediate window هست که باید پنجره ی call stack را انتخاب کنی) ، حافظه ی استک مربوط به برنامه که تا به حال (در اون لحظه) برای برنامه ات اختصاص داده شده را لیست میکنه که برای کدوم متد هست .
اولی ، حافظه ی External Code هست که همیشه و در همه حال ثابت هست و حافظه ی استک ای هست که سیستم عامل ، فایل اجرایی برنامه ات را فراخونی کرد (در واقع همون متد Main در کلاس Program هست) .
دومی ، یعنی رویداد یا متد Button4_Click هست ، حافظه ی مربوط به این رویداد هه که اجرا شد (تا با اجرای کنترل در این رویداد ، کدهای درون این رویداد و متد را اجرا کنه) .
حالا دکمه ی F11 (را در ویژال استودیو) بزن تا کنترلر ، روی متد Test1 بره . در این لحظه ، میبینی که Test1 هم به لیست پنجره ی call stack هم اضافه میشه . به این معنا که برای این متد ، حافظه ی استک اختصاص داده شد (تا با اجرای کنترل در این متد ، کدهای درون این رویداد و متد را اجرا کنه) .
حالا باز هم دکمه ی F11 را بزن تا به کد this.Test2 (که در متد Test1 هست) برسی . در اینجا اگه F11 را مجددا بزنی ، ادامه ی کدهای درون متد Test1 را اجرا نمیکنه تا اینکه اول بره متد Test2 (ای که توسط کد this.Test2 فراخونی کردی) را اجرا کنه و بعد از تمام شدن کدهای درون متد Test2 ، تازه میاد ادامه ی کدهای متد Test1 را (که کد int a = 1 هست) اجرا میکنه .
توی هر متد هم که برسی ، اون متد ، به لیست پنجره ی Call Stack اضافه میشه .
بنابراین اگه تا متد Test3 را پیگیری کنی ، روند پنجره ی Call Stack ، به ترتیب از پایین به بالا ، میشه :
External Code>Button4_Click>Test1>Test2>Test3
و بعد از اینکه به کدهای درون متد Test3 رسیدی ،حالا مجددا همینطور F11 را بزنی ، از آخر به اول برمیگرده (همون قضیه ی خشاب اسلحه که گفتم) . یعنی بعد از اینکه کدهای متد Test3 را اجرا و تمام کرد (در این لحظه ، در پنجره ی Call Stack ، آخرین حافظه ی استک که مربوط به متد Test3 بود ، از حافظه ی استک که بهش اختصاص داده شده بود و همچنین از این پنجره ، حذف میشه)، به ادامه ی کدهای متد Test2 میاد تا ادامه ی کدهای این متد را اجرا کنه و این روند معکوس ، همینطور ادامه داره تا کدهای داخل رویداد Button4_Click تمام بشه .
در قسمت 25 ، این قضیه را توضیح دادم منتها یه اشتباه جزئی اش اینه که حافظه ی استک را جدای از بقیه ی حافظه ها رفتم اما از نظر واقعی ، این حافظه ، در بخش مجزایی وجود نداره .
حالا اینکه محاسباتی باشه یا نه را نمیدونم .
پر شدن حافظه ی استک و ارور stack overflow هم شاید به این دلیل نباشه که قطعا حافظه پر شده باشه .
کما اینکه در کد زیر که ارور stack overflow میده :
شما نمیبینین که رم تون پر شده باشه .کد:private void Button3_Click(object sender, RoutedEventArgs e) { this.StackMethod(); } private void StackMethod() { this.StackMethod(); }
احتمال داره که سیستم عامل یا clr ، کدها را (متد StackMethod در کد بالا) را مثلا هزار بار یا چند هزار بار پی در پی اجرا کرده باشه (که دقیقا میتونید در همون پنجره ی Call Stack ببینید چند بار اجرا شده) و سنجیده باشه که این کد بی نهایت هست یا نه و بنابراین ارور stack overflow را داده باشه (دقیقا نیدونم ماجرای دقیقش چجوری هه) .
حالا منتظر جواب دوستان هم باشید .






پاسخ با نقل قول
Bookmarks