 اسلام علیکم today's lecture number 24 of our Introduction to Programming course اور آج کا ہمارا اجندہ جو ہے وہ بہت ہی ایک exciting topic ہے atleast میرے لیے exciting ہے and I'm sure you will also like it this concerns memory allocation ابھی تک ہم static memory allocation کرتے آئے ہیں آج ہم dynamic memory allocation کریں گے اور پھر ہم دونوں کے advantages or disadvantages بھی دیکھیں گے and finally we will look at what the common programming errors might be when we use dynamic memory allocation تو آئیے let's talk about what is dynamic memory allocation دیکھیں ابھی تک ہم in a way کرتے آئے ہیں کہ جی variables بھی declare کیے ہیں arrays بھی declare کیے ہیں اور جب بھی ان کو declare کیا تو ہم نے arrays کا size pre-define کر دیا جب ہم نے وہ کلاس کا age کا example کیا تھا ہم نے کہا جی assume کر لیں saw students ہوں گے کلاس کے اندر may be 20 تھے may be 25 تھے so you realize that there was a lot of wasted memory in our program but since our computers are pretty big pretty fast lots of RAM we didn't really worry about it when our programs become more complex and they start using more resources then it becomes important to try to minimize the memory usage and use only as much as we need this is where dynamic memory allocation comes in so static memory allocation جو تھی جب بھی ہم نے کہا int ijk اس نے 3 انٹجرز کے لیے memory میں جگے save کر دی جہاں پہ ہم نے کہا 4s20 تو اس نے 20 کرکٹرز کے لیے memory میں جگے allocate کر دی یہ ساری جو ہے یہ static allocation ہے اس کو ہم compile time allocation بھی کہہ سکتے ہیں یعنی it is defined at the time when we wrote the program کہ یہ memory کتی استمال کرے گا what can we do about dynamic memory allocation whenever we do not know in advance how much memory would be required we would want to use dynamic memory allocation and again the problem ہم نے پہلے ٹیکل کیا تھا class کا اس کے اندر what if ہم program شروع کرتے ہی پوسلے تھے کہ جی class میں کتنے students ہیں جتنے students آپ بتائیں اتنو کے لیے ہم memory جو ہے وہ allocate کریں is there a possibility of doing so answer is obviously yes and we want to look at what are the various functions we can call to allocate memory dynamically see جو ہے وہ ہمیں 3-4 functions دیتی ہے to manipulate this memory پہلی چیز تھوڑے سے digress کر کے ہم بات کرتے چلیں کہ memory آتی کہاں سے ہے پہلی دفع ہی میں نے mention کیا جو ہمارے program یہ ایسانشلی start پہ چل رہے ہوتے ہیں لیکن there is another part of memory جس کو ہم heap کہتے ہیں heap ڈھیر so simple ایک memory کا ڈھیر بھی side پہ پڑا ہوا ہے dynamic memory allocation جو ہے اس ڈھیر میں سے memory لیتی ہے لیکن یاد رہے کہ جی جیسے جیسے ہمارے computer کے اوپر مختلف programs چل رہے ہیں وہ اس heap میں سے memory اپنے اپنے استعمال کے لئے لے رہے ہیں لہاہذا the heap is constantly changing and maybe windows itself is using some memory you've got a word processor running that is using some memory وہ ساری allocate ہو چکی ہوئی ہے heap میں سے جو باقی بچتی ہے وہ ہمارے program کو available ہوتی ہے اور ہمارا program جو ہے dynamically memory allocate کرے گا وہ heap میں سے کرے گا let us look at what is the first function we can use to allocate memory from the heap before we start allocating memory we have to understand a few concepts اور یہاں پہ وہی concept ہیں pointers کے جو کہ پھر واپس لانے ہیں جب ہم کوئی بھی memory allocate کریں گے تو ہمیں ملے گا کیا we have to be clear about that دیکھیں جب ہم int i کہتے تھے تو ایک memory location reserve ہو جاتی تو اس کا label لگ جاتا تھا اور i کا label ہم استعمال کرتے تھے اپنے program کے اندر یہاں پہ situation یہ ہے کہ جی memory چلتے ہوئے program میں سے allocate کی جائے گی لہاہذا it is very difficult to determine upfront کہ یہ ایرے ہے یہ انٹیجر ہے یہ دس انٹیجر ہیں یہ کتنی جگہ ہے لہاہذا we have to work with pointers whenever we allocate any memory from the heap essentially ہمیں اس memory block کی جو starting position ہے اس کی value return ہوتی ہے as an address that address we normally keep in a pointer اور پھر اس pointer کی مدل سے ہم اس memory کو manipulate کرتے ہیں to complete the picture ہمیں we have to understand کہ جی pointer کی ایک نئی قسم وہ ہمیں introduce کرنی پڑتی ہے وہ قسم ہے void pointer کی ابھی تک جو ہم pointers استعمال کرتے ہیں وہ تھا int star i which means i is a pointer to integer اس کو اٹمیٹیکلی پتا ہے کہ جی اتنی جگہ ایک integer لیتا ہے memory میں اور اس کے starting جو address ہے وہ i کے اندر پڑا ہوئے in this case where i is a pointer to an integer ہمیں اپلائے جب ہمیں چار pointer اس چار star s that means اس now a pointer to a data type of type character لہذا اگر character ایک بائٹ لیتا ہے memory میں تو اس اس طرح سے manipulate کرے گا اس memory کو اور اس کا starting address اس میں ہم نے رکھا ہوگا so every pointer that we have used so far pointed to a specific data type یہ جو ہمارے function سے memory allocation کے جو آج ہم دسکرنے جا رہے ہیں یہ تو ہمیں ایک heap میں سے ایک chunk of memory دے دیتے ہیں وہ chunk of memory جو ہے اس کو نہیں پتا کہ وہ integers کے لیے استمال ہوگی یا characters کے لیے ہوگی or floats کے لیے ہوگی or doubles کے لیے ہوگی یا کسی structure کے لیے ہوگی وہ بھی ہو سکتا ہے لہذا وہ جو pointer return ہوگا وہ کس کسم کا ہو وہ pointer جو ہے وہ ہوتا ہے void pointer so weo id then star کے ساتھ جو بھی pointer کا variable name آپ نے رکھنا ہے وہ رکھیں void pointer جو ہے وہ ایک خاص کسم کا pointer ہے لیکن اس کو استمال کرنے سے پہلے we have to cast it جسے کہتے ہیں جسے ہم ایک eat کا سانچہ بناا کے اس کے اندر cement یا کچھ دالتے ہیں casting کرتے ہیں یا لوہ کی casting کرتے ہیں اسی طریقے سے ایک void pointer کو بھی ہمیں کسی سانچے میں دالنا پڑتا ہے تاکہ اس کی casting ہو سکے اور وہ ایک original defined data type ہے اس طرح کا pointer بن سکے casting کے لیے جو see میں operator استمال ہوتا ہے وہ standard cast operator ہے which means parentheses کے اندر سمپل اس کا نام دے دیا جاتا ہے اگر میرے پاس ایک pointer ہے called ptr and it is defined as a void pointer so in our program we have written void star ptr جب میں اس کو استمال کرنا چاہتا ہوں to point to a set of integers so first I cast it which means I convert it to a type of pointer to an integer اور اس کو کرنے کا syntax جو ہے quite straight forward parentheses میں ہم لکتے ہیں int star اب یہ دونوں چیزیں parentheses کے اندر آگئی parentheses بند کرنے کے بعد ہم لکتے ہیں ptr اب یہ سمجھ لیں یہ سانچے کی قسم ہے ptr was a void pointer اس کے سامنے ہم نے سانچا رکھا the cast رکھی and the result of the cast ptr is now a pointer to an integer this you should understand انٹ کی جگہ پہ میں چار لکھ دوں میں دبل لکھ دوں میں float لکھ دوں it converts ptr to a pointer of the specific type so this is very very useful when we work with our memory allocation functions وہ جنریک ہیں یعنی وہ ایک chunk of memory انہوں نے دے دیا اور اس کے ساتھ ایک void pointer ہمیں return کر دیا جب اس memory میں ہمیں خاص دیتا رکھنا چاہتے ہیں تو پہلے pointer کو cast کریں گے اور پھر اس کو استعمال کریں گے it is an error in this I would stress very strongly it is an error to try and use the void pointer and dereference it یہ نہیں کہیں پہاں آپ star ptr ویسے ہی اگر لکھنے اور استعمال کرنا چاہیں کسی expression کے اندر تو وہ ایک error ہوگا تو آپ ایک void pointer کو cast کریں گے before you get to use it ایک پہاں پہاں ایک پہاں پہاں اور پہاں پہاں ویلیو ہے نل ویلیو جب ہمیں پہاں ایک پہاں ایک پہاں ایک پہاں پہاں نل ویلیو نل نل is n-u-l رٹنن پہاں یہ ایک ویلیو ہے جو کے standard lib کے اندر دیفائند ہے اگر آپ شاپ include standard lib.h پر کرتے ہیں تو نل آپ کو available ہو جاتا ہے actually it's nothing fancy it is all zeros so a null pointer is a special type of pointer جس کی value is all zeros all zeros is an invalid memory address we cannot use it to store things or read things from it so it is a good way of checking کہ جی pointر وہ کسی valid جگے کو point کر رہا ہے یا وہ null ہے سمجھلیں جس طرح ہم integer کو initialize کرتے ہیں تو ہم کہتے ہیں یا وہ zero ہے یا کسی valid value اس کے اندر ہے اسی طریقے سے جب ہم pointر کی بات کرتے ہیں تو یا وہ کسی valid memory location کو point کر رہا ہے اور یا وہ اس کی value null ہے یہ باتیں کر کے let's go on and look at our first dynamic memory allocation function یہ function ہے caloc c-alloc so c-a-l-o-c caloc function اس کو دو arguments دیے جاتے ہیں پہلا جو ہے وہ کہتا ہے کتنی جگے چاہیے in terms of number اور دوسرا argument وہ کہتا ہے کس size کی جگے چاہیے so we can tell it I need n elements of type integer so normally آپ نے دیکھاگا ہم نے پہلے function استعمال بھی کیا تھا size of operator استعمال کیا تھا size of is useful in these cases when you want to write code which is independent of the particular machine that we are running on so if I were to say caloc c-a-l-o-c اور پھر پر nthesis کی اندر 1000, size of int what it will do is it will return a memory chunk from the heap of 1000 integers مجھے نی پتا کہ integer 4 bytes کا ہے یا میری مشین پہ 8 bytes کا ہے جتنے کا بھی ہوگا وہ automatically a size chunk ہوگا امیجت لی آپ اسنا چاہیں گے کہ جی اگر وہ چنگ اتنا بڑا ہو ہی نا جتنا ہم چاہ رہے ہیں پھر کیا ہوگا well obviously پہلی بات کہ جی وہ دھیر ہے ہمارا heap memory جو ہے it better have enough free memory available number 2 وہ free memory جو ہے وہ تکڑوں میں بٹی ہوئی نہیں ہو سکتی وہ اس باستے کہ جب ہمیں واپس ملے گا وہ pointer ملے گا to the starting point of this chunk of memory that we have allocated اگر وہ starting point ہے تو that means باقی ساری memory in sequence پڑی ہوئی ہے it is one block end to end اس کے درمیان میں gaps or holes نہیں ہو سکتی یہ تین تکڑوں میں واپس نہیں آسکتی so what happens when either we ask for too much memory and there isn't enough on the heap or we ask for memory which is available on the heap but it is not available as a single chunk then the call to c-alloc will fail when the call to any of these memory allocation functions fails it returns a null pointer so جو واپس آتی ہے value وہ نل ہوتی ہے now this is crucial it is important to understand کہ جب بھی ہم memory allocation function call کریں so سب سے پہلی چیز جو کرنی چاہی اس کے بعد وہ ہے چیک کریں کہ جو واپس value ہے pointer کی وہ نہیں ہے اگر وہ نل نہیں ہے تو آپ کو وہ memory مل گئی ہے اگر وہ نل ہے then one of two things happened you either ask for too much memory or a single chunk of that size is not available on the heap so now for example اسی example کو لے کے آگے چلیں تو اگر میں نے اس کو as an integer block treat کرنا ہے تو استمال کرنے سے پہلے میں اس کو cast کروں گا اور cast کرنے کیلی میں اس سے پہلے لکھوں گا اس کے بعد انٹ سٹار اور پھر آگے میں caloc کی call لکھ دیتا ہوں caloc اور پھر آگے 1000 جو بھی مجھے چاہی n چاہی اس کی formal definition آپ دیکھ رہے ہوں گے آپ کے handouts میں بھی دی ہوئی ہے جہاں پر ہم نے size t استمال کیا ہے اور variable names استمال کیا ہے size t normally long کے برابر ہوتی ہے caloc کا ایک اور فائدہ بھی ہے جب بھی آپ caloc سے memory allocate کرتے ہیں وہ memory automatically is initialized to all zero's in other words it is set to zero ہیب سے جو بھی چیز اٹھاتے ہیں سب zero's لکھ کے پھر اس کے starting point کا address آپ کو pointer میں available ہوتا ہے اور یاد رہے یہ ہوتا ہے void pointer اور اس کو استمال کرنے سے پہلے آپ کو اس کو کئی دفعہ ہم یہ کرتے ہیں کہ جی ہم ایک علیدہ سے normal usage جو ہے اگر let's سے میں نے integers کے لیے استمال کرنا ہے اس memory کو پہلے تو میں ایک integer pointer declare کر لوں گا اپنے program میں میں کہوں گا int star iptr so iptr is a pointer to an integer اس کے بعد میں جب caloc کے سات memory allocate کرنے جاونگا تو میں left side پے لکھ دوں گا iptr is equal to right side میں cast operator لکھوں گا so int star within parenthesis which means cast it to a type of pointer to an integer اس کے بعد caloc کی call جائے گی اور جو بھی آئے گا وہ iptr کے اندر address آجائے گا iptr since it's a pointer to an integer I can use it to manipulate all the integers I want in that memory space one thing important and I'll repeat it again immediately next line after double equal to استعمال کر کے تو پھر کوئی exit کریں یا جو بھی error handling کرنی ہے وہ کی جائے انی سب سے پہلا کام جو ہے after the memory allocation has happened is to check that you don't have a null pointer if you have then your logic should handle it and you must allow for a decent way of escaping the program should not crash you should let's go to the next way of allocating memory اسی کا رشتدار ہے first cousin ہے which is called m-alloc c-alloc جو تھا اس کو کہا ہم نے کہا تھا اتنے elements چاہیں اور اس سیز کے چاہیں m-alloc ان دونوں چیزوں کو ایک اٹھا کر دیتا ہے اور اس کے اندر صرف ایک چیز ہم بتاتے ہیں کہ جی کتنی بایٹ چاہیں سیدہ سیدہ so many bytes are needed and the allocated chunk of memory which is obtained from the heap if that memory is available if the memory is not available or is fragmented ڈوٹی ہوئی ہے تو پھر وہ allocate نہیں کر پایا گا جگے کو اور وہ null pointer کو return کرے گا یہاں پہ بھی m-alloc کو استمال کرتے بے نواملی ہم استمال کرتے ہیں size of operator کو تو ہماری call جو ہوتی ہے usually ہوتی ہے m-alloc پھر پر anthesis کے اندر ملتیپلائٹ بای size of int because size of int will return the number of bytes that an integer occupies in memory so if I need space for 1000 integers I need 1000 times size of int bytes and that is what I will send to malloc if I want a character I will say 1000 times size of char اسی طرہ double اسی طرہ float 1000 کی جگے پر I can say n میں سے malloc n times size of float where n کوئی variable ہے جس میں وہ value پڑی ہوئی ہے جتنی elements مجھے چاہی ہیں ایک پچھلے لیکچہ سے میں حوالہ دیتا چلوں دیکھیں وہاں پہ ہم نے sharp define جو تھا pre-processor دیریکٹی وہ استمال کیا تھا another good thing for using or reason for using sharp define was to define the size of an int x or square brackets میں کوئی value دینی ہوتی ہے وہ value it must be a constant it cannot be a variable so sharp define جو تھا ہم یہاں پہ استمال کر سکتے تھے تاکہ کوئی symbolic name attach ہو جائے max students 100 اور پھر نیچے array declare کریں تو we can say int students max students square brackets کے اندر دے دیا وہ ہے static memory allocation آج ہم بات کر رہے ہیں dynamic کی تو اب اس کو کیسے حاندل کریں اس وقت ہم کیا کرتے ہیں کہ جی آپ if you go back to your age program now the program should initially find out how many students you want to work with let us take the let's define the problem again I said find the average age of the students in your class اور average age ہم اس طفہ since we now have the tools ہم کہتے ہیں کہ صرف average age نہیں بتاو مجے یہ بھی ہر student کی age کتنی ہے کتنے students ہیں اور پھر ان کی average age کیا نکلی ہے اس کے لیے اب dynamic memory allocation کے ساتھ ہم اس طرح سے کچھ لکھیں گے program کہ سب سے پہلے تو آپ پوچھیں کہ جی کتنے students ہیں so user جو ہے enter کرتا ہے 24 or 33 or whatever the number of students وہ ایک variable میں چلے گا let's call the variable numstads age کو ہم کہیں گے will be integers so whole number میں ہم age لیں گے ہم نہیں کہیں گے کہ جی اس کی عمر جہاں سڑے 22 سال ہے ہم کہیں گے age is 22 years or whatever اب مجھے ایک memory area چاہی ہے جہاں پے numstads جتنے integers میں store کر سکوں so اس کے لیے now we're not going to use arrays we use a pointer to a memory area where many integers are stored so we declare let's call it iptr now we put in a call to either calock or mallock both are valid so iptr will be equal to mallock اب یہاں پے within parenthesis میں لکھوں گا numstads so number of students کیلیے جو بھی ہم نے variable name استمال کیا تھا times star اور آگے لکتا ہوں size of int اس کے بعد as per the rule I immediately اگر تو نال نہیں آیا it means کہ جی مجھے جگے مل گئی ہے اب میں آپ سے کہتا ہوں loop چلالیں اور وہ students کی ages پڑھتے جائیں اور اس جگے پے memory کے اندر لکھتے جائے کیسے لکھیں گے وہ یاد ہوگا آپ کو pointer arithmetic والا جو تھا ہمارے پاس لیکچر کہ یہ pointer اس کو increment بھی کر سکتے ہیں بہتر یہ ہے کہ آپ ایک second pointer استمال کر لیں تاکہ beginning location جو ہے وہ آپ کے پاس قائم رہے second pointer اس پی تیر also a pointer to integer اور سکتے ہیں اس پی تیر is equal to i p t r تو جو بھی i p t r کی value تھی وہ ہم نے اس پی تیر میں رکھلی now it points to the first integer in this array of 33 or whatever numstud integers that we used and now we can increment اس پی تیر and write values that the user enters with the keyboard into this memory پھر اس کے بعد normal and then eventually also take the average and print it out فیدہ کیا ہوا کوئی memories waste نہیں ہوئی ہم نے یہ نہیں کیا کہ جی پہلے 100 students کے لیے array declare کرو پھر اس میں 24 جگہ وہ استمال کرو ہم نے exactly اتنی memories استمال کی جتی ہمیں چاہیے تھی کوئی cost ہے always there's a cost you know whenever you get a benefit there's always the cost comes in terms of management آپ کو خود اب memory کو manage کرنا پڑتا ہے کیا مطلب ہے management کا کبھی ہیپ پڑی ہوئی تھی وہ عرام سے اپنی زندگی بسر کر رہی تھی ہمارا program یہاں پہ تھا جہاں پہ سٹیٹک memory ہم نے define کیوئی ہے اتنے point سے اتنے variables ہیں وہ سب سٹیٹک ہیں اب چلتے چلتے program میں سے ہم نے suddenly ہیپ میں سے ایک چنکو تھالیا memory کا ہم نے ہیپ سے allocate کی تھی اس کی ہمیں آپ ضرورت نہ ہو تو اس کو free کر دیں اس کو واپس ہیپ میں دال دیں وہ اس واستے تاکہ operating system یا دوسرے programs یا ہمارا ہیپ program اس کو پھر سے استعمال کر سکے جتنی دیرتاق ہم نے وہ memory allocate کیوئی ہے that memory is not available for use by any other program so it is now our management responsibility to free the memory so how do we do that very logical very easy we use the key word called free f r e e and free کو ایک ہی argument دیا جاتا ہے وہ وہ pointer ہے جس کے زیرے سے ہم نے memory allocate کی تھی so we just say free i p t r and that memory جو ہم نے caloc or malloc سے allocate کی تھی وہ free ہو کے واپس ہیپ پہ چلی جاتی ہے but remember and I will I can't stress this enough it is our responsibility whenever we have a malloc or a caloc call which means we have allocated memory from the heap as programmers it is our responsibility to free the memory when we are done with it یہ جاکے میں دیسکس کروں گا a common programming errors کی اندر یہ بہت common problem ہے اور یہ problem آپ کہ لیں is one of the fundamental reasons جس کے لیے ایک پوری movement چل پڑی کے جی point is بری چیز ہیں ان کو استمال نہیں کرنا چاہیے یہ بڑی سری ہیڈیکس بیدا کرتے ہیں it is true because in a complex program even like your operating system itself you have what we call memory leaks but I will come to the memory leaks in a few minutes we have looked at caloc and we have looked at malloc and then we have said کہ جی there is a keyword back to the heap what happens اگر ہمارے پاس وہی students example لیکے ہم نے کہا کتنے students ہیں 24 اور program چلا دیا ہم 22 کی ابھی age input کر رہے تھے تو 25 مہ student دروازے سے داخل ہو گیا in other words is there a way that once we have allocated a certain chunk of memory can we increase its size اسی چنگ کو ہم بڑا کر سکتے ہیں کی نہیں کر سکتے ابھی اس کو سکتے ہیں سوچنے کیا if the answer was no yes there is a way اور اس کے لیے جو function ہم کال کرتے ہیں وہ ہے ریالوک ریالوکیشن of memory ریالوکیشن of memory جو ہے اس کو دو آگومنٹ دیے جاتے ہیں پہلا وہ پوینٹر جو کہ original memory کو پوینٹ کر رہا تھا ہم نے کہالوک یا میلوک سے ایک چنگ لیا ہیپنے سے اس کو پوینٹ کر رہا ہے let's say iptr پاس کرو اور اس کی جو بھی سائیس تھا اس کی جگہ پی اس کا نیا سائیس دے دو اگر پہلے ہم نے 20 انٹیجرز رکھے بے تھے اب ہم اس کو کہتے ہیں 100 انٹیجرز ہمیں الوکیٹ کر دو if real lock succeeds there are 2 ways in which it can succeed and you have to be careful so listen attentively ایک طریقہ یہ ہے کہ جب ہم نے ہیپنے سے memory لی تھی پہلی let's say وہ 20 انٹیجرز کی memory اس کے بعد والی memory ساری فارق پڑی ہوئی تھی so program چلتا رہا جہاں پہ آکے ہم نے کہا کہ 20 کی جگہ پہ 100 انٹیجرز کی جگہ مجھے چاہیے تو اس نے جب جاکے ہیپنے دیکھا تو دیکھا کہ باقی memory فارق پڑی ہوئی ہے اس نے اسی جگہ کو expand کر دیا iptr کی value وہی رہی جو پہلے ہمیں ملی تھی in other words it still points to the starting location but now the locations not just 20 they are 100 so that is one way that realloc can work we do not know how it's going to work there is another way suppose جب ہم نے 20 انٹیجرز کی لیے memory allocate کی اس میں آگے والی memory کہیں اور allocate ہو گئی یا کوئی اور program چل پڑا computer پہ جس نے وہ memory استمال کر لی اب جب میں کہتا ہوں کہ 20 سے اس کو expand کر کے 100 پہ لے جو تو آگے اس کو جگہ نہیں ملتی وہاں break لگی ہوئی ہے دیوار کھڑی ہے وہاں سے آگے میں expand نہیں کر سکتا so what does it do now it goes back to the heap and looks for more memory and what it's looking for I mentioned earlier it's looking for one contiguous block of 100 locations for integers contiguous ہنا لازمی ہے so it goes back to the heap and says کہ جی saw integers کی کہیں پہ بھی کوئی جگے بنتی ہے کہنی بنتی اگر بنتی ہے تو realloc وہ والی جگے allocate کرے گا جو پہلی بیس ہمارے پاس position ان کی value اس میں copy کر دے گا باقی جگہ ہمیں فارق کر کے IPTR کو اب point کرا دے گا نئی جگے پے so IPTR کی value بدل گئی ہے it now points to a new memory location which now has space for 100 integers and the original memory is returned to the heap so realloc is doing a lot of complex things it has two ways of functioning I'll repeat one is existing memory سے آگے اس کو جگے مل گئی so اس نے expand کر کے واپس آگیا or IPTR یہنی ہمارا point جو تھا جو اس memory چانک کی beginning کو point کر رہا تھا اس کی value نہیں بدلی دوسرہ طریقہ کہ اس کو اور جگے وہاں سے آگے نہیں ملی but it found enough space اس کو جاتا ہے یہاں جیب سبت ملی چیجی اس کو جیب جیب شمہ جمع چیجی جیب جانی جنی جب جو جزیر جنی جزیر جزیر اس سے بھی ہم دیتا کو مانیپلیٹ کر رہے ہیں اور iptr سے بھی دیتا کو مانیپلیٹ کر رہے ہیں. درمیان میں جاکے ہم نے real lock کال کر لیا کہ جی بیس کی بجائے سو جگہ دے دیں۔ real lock نے وہ جگہ اکپنڈ نہیں کر پایا اس نے نی جگے واپس لாکے آپ کو دے دی. iptr تو valid ہے وہ اسی جگے کو point کر رہا ہے اور آپ کا کام چل رہے گا. لیکن ابھی میں نے منیشن کیا تھا کہ یہ ایک سٹپ کرنے کے لیے شاہد ہم نے ایک اور pointر بھی دیفائن کیا ہے اس میں اوپر ہم نے کیا دیا تھا اس پی ٹیر ایک پول ٹو آئی پی ٹیر اس کی ویلیو اس میں رکھلی تھی اور منیپلیٹ کر رہے تھے. ری الوک کے بعد اس پی ٹیر now points to an invalid location. It points to memory which is now freed وہ ہمارے کنٹرول میں نہیں ہے وہ تو کسی اور پروگرم کا حصہ ہے. اب اگر اس پرانے والے پوینٹر کے ساتھ آپ اس میمری کو منیپلیٹ کرتے ہیں. آپ جا کے اس میں کوئی پچیس فردنٹ کی اج لکھ دیتے ہیں. اس بہت گوزہ کنی کی سوگ کسی ہوتا ہے ، کسی کسی کسی پرانے میں بہت گوزہ ہے ، آپ جو اپنے کسی پرانے میں بہت گوزہ ہے۔ ہمیں کنی نہیں سکتا ہوں۔ بہت ایک پوینٹ آئے دنی بھی سبہ your سبوہیٹی ہی بہت گا ہے۔ اگر ری الوک کے از پوینٹر کی ری آئے پوینٹر کیا ہے اس کی ویلیو کہی اگی اور بھی سیف ہوئی تھی کسی کوئی پوینٹر میں بھی یا کئی پوئنٹر میں تھی تو وہ تمام پوئنٹر لسٹ کو اپڑیٹ کیا جائے and as I said with all of these memory allocation functions the first thing to do is check for null null تو نہیں آیا which means realloc did not work now وہ اس طرح سے بڑا کر سکا ہے now وہ کوئی اور memory location حاصل کر سکا ہے memory تھی ہی نہیں ہیپ کے اوپر so null should be checked first and once you have checked null then you go on and make sure that if there are any other pointers which were referencing the same area they are also updated so be careful with that you will have noticed کہ جو پاور ہمارے پاس آ رہی ہے memory allocation کی اس کے ساتھ ساتھ خطرے بھی آ رہے ہیں یہ real خطرے ہیں and now we would probably want to talk about what are the common programming errors that can happen with this memory allocation کالوک مالوک ریالوک and then free یہ ہم نے چار memory manipulation functions کور کیا ہے problem کیا آتا ہے پہلہ problem جو ہے وہ ہے unreferenced memory کا ہم نے ہیپ سے memory allocate کی ایک point ہے ہمارے پاس وہ اس کو point کر رہا ہے اور کسی وجہ سے وہ وجہ بھی میں بتاتا ہوں کسی وجہ سے یہ point جو ہے یہ مر گیا in other words it doesn't exist anymore in our program what happens to the memory that we had allocated that chunk of memory is now unreferenced اس کو کوئی چیز بھی point نہیں کر رہے اگر وہ point نہیں کر رہی تو ہمارا program تو certainly اس کو استمال نہیں کر سکتا اور اگر ہمارا program نہیں کر سکتا تو کوئی اور بھی نہیں کر سکتا یہ memory زایا ہو گئی in other words computer کی overall heap جو ہے وہ چھوٹی ہوتی جا رہی ہے اور اگر یہی کام جو ہے یعنی memory allocate کی اور pointer کو ختم کر دیا مر گیا کسی طریقے سے اور یہ کام ہم نے repeat کیا تو وہ heap جو ہے وہ چھوٹی پہاڑ سے پہاڑی پہاڑی سے ایک چھوٹا سا ڈھیر اور ڈھیر سے بالکل ختم zero ہو جائے گی what happens when you have zero memory on the heap your computer normally stops running so you have a system crash this is also called a memory leak کیجی memory leak کر رہی ہے وہ جو پہاڑ تھا وہ leak کر کر کیا ایس طایستہ ایس طایستہ zero ہو گئے and the problem with memory leaks is کیجی شہدو آپ program لکھیں چلائے program first class چلے اور program ختم ہو جائے آپ کو پتا بھی نہیں چلے گا کہ memory leak ہو گئی ہوا کیا کہ ایدر ہمار پاس 128 megabyte memory پڑی ہوئی دی اس میں سے ہم نے کوئی 64k memory جو ہے نا وہ حاصل کی اور بغیر اس کو فری کیے بے program مر گیا یا پونٹر ختم ہو گیا وہ memory بیسی کی بیسے allocated پڑی رہی 128 megabytes میں سے 64k نکل گیا so what's the big deal well the big deal comes when that 64k allocation happens inside a loop which runs 10,000 times certainly that 64k becomes 64k times 10,000 and that amount of memory is taken from the heap and that amount of memory is taken from the heap اور ہو سکتا ہے کہ وہ 10,000تھ واری loop کے اوپا جاکے suddenly the program stops working surprise یہ تو program کل بلکل ٹھیک چل رہا تھا آج کیوں نہیں چل رہا آج اس پاس دے نہیں چل رہا کہ آپ وہ loop counter اتنا آگے تا گیا ہے کہ یہیپ ختم ہو گیا آپ کی allocations نہیں ہو سکتی same thing happens to other programs running on the machine the whole system can lock up so memory leak is a very serious issue and if you know some of the history of these operating systems جو آج کل ہم استعمال کر رہے ہیں آپ کے PC's پہ بھی چل رہے ہیں in operating systems میں بھی یہ بگ جو ہے یہ بہت کومن تھا اور یہ ہی ہوتا تھا کہ جی چل رہا ہے سیسٹم چار گھنٹے استعمال کیا پانچ بے گھنٹے یا آکے سیسٹم حالت کر گیا پھر اس کو reboot کریں تو جب اب reboot کرتے تو memory ساری back to normal ہو گی واپس heap جو ہے نا وہ زندہ ہو کے واپس مل گئی لوگوں کو سمجھنی آتی تھی ہو کیا رہا ہے تل دی کام out with some very very sophisticated debugging techniques which says where is this memory going اور وہ آسطا آسطا پتہ چلا کہ جی heap جو ہے نا وہ allocate ہوتی جاری ہے free ہو نہیں رہی memory is leaking out it is no longer usable how does it happen and what can we do to prevent it now the way ایک سمپل میں آپ کو طریقہ بتاتا ہوں how a memory leak can happen suppose ہمارا main program جو ہے ایک function کو call کرے function کے اندر ہم نے ایک pointer variable declare کیا ہوئے let's say ptr is a pointer to an integer and it is declared inside the function پھر اسی function کے اندر ہم نے malloc call کیا یا calloc call کیا اور کچھ memory allocate کیا allocate کر کے اس اس memory کو ہم نے استعمال کیا اور بغیر free کیے ہوئے ہم function سے واپس main program میں چلے گے what happened to ptr and this question is a general one what happens to all variables which are local to the function by now you should know when the function is called اس کے local variables اس وقت create ہوتے ہیں ان کی scope function scope ہے اور جب ہم function سے exit کرتے ہیں وہ variables destroy ہو جاتے ہیں so far so good but the problem یہاں پہ جو complicate کر رہا ہے وہ یہ ہے کہ ptr was a pointer variable اور pointer variable کے ذریعے ہم نے calloc یا malloc استعمال کرتے ہوئے کچھ heap سے memory اٹھا کے allocate کر لی اب جب function exit کرے گا تو allocated memory کو کچھ نہیں ہوتا but ptr variable جو تھا it stops existing it ceases to exist it is no longer there because the function is no longer there which means وہ جو memory ہم نے allocate کی تھی وہ اب unreferenced memory ہے it has leaked this is a memory leak اب سمجھنے کے جی main کے اندر وہ ہی function call ہو رہی ہے بار بار بار بار ہو رہی ہے بار بار یہ chunk allocate ہوتے جائیں گے اور زایا ہوتے جائیں گے they will never be returned to the heap so as programmers it is our responsibility and a good rule of thumb would be کہ جی جس function میں memory allocate کی جائے اس function میں memory free بھی کی جائے now it is easier said than done کئی دفعہ program کا logic ہی ایسا ہوتا ہے کہ جی allocations کہیں اور ہو رہی ہوتی ہے استعمال کہیں اور ہو رہا ہوتا اور میں جب کہیں کی بات کر رہا میں functions کی بات کر رہا ہوں کہ جی ایک function میں ہم نے memory allocate کی کسی اور function میں اس کو استعمال کیا اور کہیں اور پہ جا کے ہم نے exit کیا وہاں پہ ہمیں خاص خیال رکھنا پڑتا ہے کہ یہ سارہ جو ہے realm یہ memory management میں fault کر رہا ہے کہ جی آپ اسی function میں ہم فری کرنی سکتے کیونکہ یہ allocated memory ہمیں کہیں اور چاہیے so we have to do sophisticated programming to make sure that whenever we allocate memory somewhere or the other it is freed now this is not just to do with function calls it also has to do with when the program ends see let's take a look at this way کہ اب program ہمارا چل رہا ہے ہم نے کہیں پہ memory allocate کر لی اور کہیں پہ آکے کوئی condition ایسی آگئی جہاں پہ ہم نے کہاں program کو exit کر جو کوئی divide by zero ہونے لگا ہم نے کہاں یہ crash کرنے سے بہتر ہے کہ exit کر دو اگر آپ نے memory free کیاں بغیر exit کر دیا تو پھر وہ memory leak ہو گئی اور یہ memory leak remember is at the operating system level اپریٹنگ سسٹم جو ہے windows یہ unix و گیرہ ان کو نہیں پتا کہ یہ memory allocate کی تھی اب اس کو استعمال کرنے والا کوئی نہیں ان کے حصاب سے تو یہ memory کوئی program استعمال کر رہا ہے تو whenever you write programs not only is it کہ جی کوشش کریں جہاں پہ allocate کر رہے ہیں وہاں پہ free بھی کی جائے لیکن program exit points کے اوپر you must do some housekeeping and the housekeeping is make sure that when you've allocated memory in the program exit points کے اوپر اس memory کو free بھی کیا جائے free کر کے the second important thing is کہ جی pointer کو explicitly null assign کرنے اس کا بھی یہ فائدہ ہے کہ جی اس pointer کو test کیا جا سکتا ہے کہ جی اس وقت یہ کسی memory کو point تو نہیں کر رہا because if you freed the memory and you've explicitly set the pointer to null you can always test it and say okay I've done all my housekeeping memory has been returned to the heap I can safely exit so if you've done four memory allocations you've freed three and you've set those three pointers to null on the housekeeping or the exit routine you can always go back and check یہ تین تو ٹھیک ہیں یہ چوتھا جو ہے ابھی بھی کسی چیز کو point کرے اس کو بھی free کر دو وہ بھی memory چلی گئی and your housekeeping is complete so whereas we do get this considerable flexibility in doing dynamic memory management it is also our responsibility for freeing all the memory that we allocated from the heap the other side of the coin is also کہ جی اگر ہم نے dynamic memory management ہی استمال کرنی اپنے programs کے اندر تو جب بھی آپ memory allocations کریں تو فورن چیک کریں کہ جی memory ملی ہے کہ نہیں ملی اگر نہیں ملی provide a graceful exit in the program don't just crash it is important to know that now memory leak was one type of subtle error that can happen there is another one the other one is even more dangerous وہ ہے جس کو ہم کہتے ہیں dangling pointer یہاں پہ اس کا memory leak کا inverse effect آ رہے effect یہ آ رہے کہ یہ ایک pointer ہے وہ کسی chunk of memory کو point کر رہا تھا اب کسی وجہ سے وہ وجہ میں ابھی explain کرتا ہوں یا situation بتانے کی کوشش کرتا ہوں کسی وجہ سے وہ memory deallocate ہوگی ہے وہ واپس ہیپ پہ چلی گئی ہے اور pointer کے اندر اسی chunk کا starting address ابھی بھی پڑا ہوا ہے اب کیا ہوگا اگر اس pointer کو استمال کر کے ہم نے memory میں کچھ لکھنے کی کوشش کی who knows something very surprising or strange might happen وجہ جب ہم نے memory free کر کے واپس ہیپ پہ دال دی ہے تو ہو سکتے کوئی اور program اس memory کو استمال کرنے لگ پڑے so windows itself might start using that memory microsoft word or whatever program you have running on the computer other than your own program وہ شہد وہ memory کو استمال کر رہا ہوں آپ کا program جو ہے وہ انجانے میں اپنے مزے سے اپنی دگر پہ چلتا جا رہا ہے اس نے اس pointer کو استمال کر کے کہا یہاں پہ 5 لکھ دو پتا چلا کی جی مشین میں سے دھوہ نکل گیا well actually دھوہ نکلے گا but it will stop working because the 5 may have been a critical memory location how does this situation arise what happens is again let's take the case of 2 pointers so we have ptr1 and ptr2 and both are pointers to integer ptr1 کو ہم نے استمال کیا by using calloc or malloc or which memory جو ہے وہ ہیپ سے allocate کر کے ptr1 جو ہے it now points to the starting point of that memory اس ممری کو ایک pointer variable کے تھوے استمال کرنے کے لیے ہم نے کہا کہ ptr2 کو استمال کرتے ہیں اور ہم نے کہا دیا ptr2 is equal to ptr1 اب ہم نے اس کا starting address لے کے ptr2 میں ڈال دیا اور ptr2 کو استمال کرتے وہ مزے سے ہم نے processing شروع کر دی in the meantime whatever happened ہم function سے نکلنے لگے تو کہا ہم نے ptr1 کے ساتھ کچھ memory allocate کی تھی تو ptr1 کو تو free کر دو ہم نے کہا free ptr1 what happens جو memory allocate ہوئی تھی وہ تو واپس چلی گئی ہیپ کے اوپر لیکن ptr2 کا کیا بنا ptr2 میں اس وقت وہ address پڑا ہوا ہے جو پہلے ptr1 نے حاصل کیا تھا اب ptr2 in a way points to memory جو کہ اب ہمارے program کی ملکیت نہیں ہے it has gone back to the heap it has gone back to the operating system اور اگر اس ممری کو پڑنا چاہیں تو پر ضرور سکتے ہیں it is non-destructive it will give you whatever individual data item is residing at that location but if you were to try and write to that location everything might break loose you have to be very careful یہ حصہ وہ ہے کہ یہاں پہنٹر ہے وہ اب point نل نہیں کر رہا it is pointing to a valid memory location ہمارے پہنچ پہنچ نہیں ہے it is not valid for our program we have a pointer that points nowhere it points to a bad location we have got a dangling pointer we have to be careful of both of these situations memory leaks and dangling pointers nonetheless you will understand and you will agree that this is a very very powerful technique of doing dynamic memory management جتنی ممری چاہیں اتنی اپریٹنگ سسٹم سے حاصل کرلو اس کو استمال کرو جد نہیں چاہیں اس کو واپس اپریٹنگ سسٹم کو دے دو what happens is that all of the programs running on your machine when I say all of the programs I am talking of modern operating systems which are multi-tasking دس چیزیں چل رہی ہوتی ہے گیارمہ ہمارا پروگرم ہوتا ہے so they work very efficiently جب چیز چاہیں ریسوز میں سے لی استمال کی اور واپس دے دی an example of shared resources دیکھیں صرف ممری کی بات نہیں ہو رہی پرنٹر بھی ذو لگا بے ہمارے کمپیٹر کے ساتھ ہمارا پروگرم بھی چاہے گا کہ کچھ پرنٹ out لے لیا جائے شاہد کوئی word processor چال رہا ہے وہ بھی چاہے کہ پرنٹ out لے لیا جائے so we are already sharing resources in these machines we are sharing the screen we are sharing the keyboard we are sharing the mouse we are sharing the peripherals monitor of course we are sharing the hard disk اس پر پروگرم بھی پڑا where documents بھی پڑی میں and data بھی پڑا ہوئے but in terms of dynamic usage we are also sharing the memory so our program in a way has to be a good neighbor it has to be a good neighbor جب مجھے جو ریسورس چاہیے میں استعمال کرنو جب میرے استعمال میں نہیں ہے وہ ریسورس واپس ہیپ کے اوپر ڈال دیا جائے so remember the free part free is as important as doing the allocation تو کسی چیزیں بھی منہ روحای سنہ ہمارے ایک میکنیے محفوظ پر جو متر کچھ لیکچس پہلے ہم نے فائل ہیلنگ کی بات کی تھی نو خطرہ تھی ہمیلی بھی کبھی بھی کیا ہیلنگ دے اس کے اندر میں نے یہ بھی منشن کیا تھا جی ہاردسک سماری وہ خوبصوری ویڈینی کانیکل ویڈینی دویسی ہے لہذا ہمیںسکتے ہیں ان کو ارسال کرنا بہتا مہنگا کہ جی اگر ان سے کچھ پرنا ہے یا وہاں کچھ لکنا ہے تو بڑی سے بڑی چیز پڑی جائے اور بڑی سے بڑی چیز لکھی جائے تاکہ the fewest disk reads and disk writes اکر. In order to do that, think about combining dynamic memory allocation with a file read and a file write. Suppose میں یہ کرتا ہوں کہ جی میں نے ایک file کوپی کرنی ہے تو file کا سائز تو میں میں ایمیجٹلی دیکھ سکپا ہوں. یاد ہے کیسے دیکھا جائے گا? انپرٹ فائل کو کھولیں اس کو انڈ پے جائیں اور آپ کہیں tell pointer جو ہے نا اس کے ساتھ اس کا سائز لے لیں tell g کر لیں tell p کر لیں تو آپ کو فائل کا سائز مل جائے گا in bytes. Now I go back to my famous heap and I say اتنی bytes مجھے allocate کر کے دے دو اگر تو میری call successful ہے now at least in my program I can ask for a single file read of this size what it mean is that the entire file will be read to memory. Now practically وہ ہوتا ہے کہ نہیں ہوتا that's an operating system issue maybe the file is so big کہ جو operating system کہے کہ نہیں میں اس کو بفر کروں گا well that we don't know and our program doesn't know all we know is ایک ہم نے کمان دی ہے پوری فائل پر لی ہے اور اسی طریقے سے لکھنے کے لیے ہم ایک کمان دیتے ہیں اور پوری فائل لکھی جاتی ہے when the operating system is involved in this way we can be assured that we are doing the most efficient disk access but before we do that we have to know کہ جی can we allocate this amount of memory from the heap so remember you must check for the null pointer returned by malloc or calloc otherwise you would.. مطلب there is a test to make sure کہ جی memory ملی ہے کہ نہیں ملی now what can you do as an exercise اپنے computer پر بیٹھ کے آپ بیشک لوپ لگا لیں کہ جی جو malloc i find is a little easier کیونکہ اس کو ایک نمبر دین ہے اتنی bytes مجھے allocate کر کے دو میں loop لگاتا ہوں کہ جی پہلی دفعہ مجھے 10,000 bytes دو اگر successful ہے which means کہ null pointer نہیں آیا میں کہتا ہوں اس کو فری کر دو 10,000 کے بجائے 20,000 bytes مجھے allocate کر کے دو اور میں اس لوپ پر بہت ہوں کہ if i am successful free the memory and allocate twice the previous amount آپ اپنے لیے کیوں نہیں یہ لوپ چلا تے and tell us on the discussion board کہ جی آپ کے computer میں what was the largest size of memory that you were able to allocate using a single call to malloc now the interesting thing is یہی کام کرتے ہیں suppose آپ کو پتہ چلا کہ جی آپ نے two megabyte memory جو ہے نا وہ allocate کر لی ہے آپ program کو روکیں دو تین applications چلا لیں کوئی spread sheet کھولنے کوئی word processor کھولنے اور واپس اپنے program میں جائیں اور کہیں پھر سے چلو اور مجھے بتاو what is the largest amount of memory tell us if you find that the memory size changed you will find something interesting and that I think will prove کہ جو ہیب تھی جسکی آج ہم نے بات کی وہ actually share ہو رہی ہے at the operating system level between all of the programs that are running on that machine at that time few things to recap آج کے لیے dynamic memory allocation is very efficient usage of computer resources as opposed to static memory allocation فائدہ static memory allocation کا very neat clean اس میں نقصان resources waste ہونے کا خطرہ ہے dynamic memory allocation very efficient in terms of memory resources but added baggage کہ جی free کرنا لازمی ہے pointer management لازمی ہے do not let memory get leaked out of the system do not have a situation where you have dangling pointers so there is an overhead in terms of memory management پسلے cs101 کے اندر جاوہ کا بھی ذکر ہوا تھا آپ آگے چلیں گے آپ object oriented programming بھی پڑیں گے اس کے اندر پھر ہم or languages کا ذکر کریں گے you will find one of the differentiating features between Java and C++ is this whole basic area of memory management this basically concludes our initial set of lectures and now we will step into something quite new but I'll let you wait for that till then good a hafiz