C++ میں ڈائنامک میموری ایلوکیشن

C My Aynamk Mymwry Aylwkyshn



عام طور پر، C++ پروگرامنگ لینگویج میں سورس کوڈز استعمال کرتے ہوئے، ایک کمپائلر ڈیٹا کو ذخیرہ کرنے کے لیے متغیر کے لیے دستی طور پر میموری کو مختص کرتا ہے۔ کہا جاتا ہے کہ یہ جامد میموری کا مختص ہونا ہے۔ یہ ایک مقررہ میموری ہے جسے ایک بار اعلان کرنے کے بعد تبدیل نہیں کیا جا سکتا۔ اس قسم کی میموری مختص کرنے کے لیے، آپریٹنگ سسٹم ڈیٹا کو ذخیرہ کرنے کے لیے اسٹیک کا استعمال کرتا ہے۔ جامد مختص میں، ماخذ کوڈ کے عمل میں آنے سے پہلے میموری کو مختص کیا جاتا ہے۔

جبکہ، ڈائنامک میموری ایلوکیشن میں، میموری کو مختص کیا جاتا ہے جبکہ عملدرآمد شروع ہو چکا ہوتا ہے۔ یہ میموری پروگرامر کے ذریعہ رن ٹائم پر دستی طور پر مختص کی جاتی ہے، جسے C++ میں رن ٹائم میموری ایلوکیشن بھی کہا جاتا ہے۔ ڈائنامک میموری کا سائز پروگرام میں کسی بھی پوزیشن پر تبدیل کیا جا سکتا ہے کیونکہ ڈیکلریشن کے وقت ہم کسی سائز کا ذکر نہیں کرتے جسے طے کیا جا سکتا ہے۔ ہم صرف قیمت براہ راست متغیر کو فراہم کرتے ہیں۔

عام متغیرات میں میموری کی تقسیم کا فرق

عام متغیرات میں، ایک کمپائلر کی طرف سے مختص کردہ میموری خود بخود مختص اور ڈیلوکیٹ ہو جاتی ہے۔ جب پروگرامر کے ذریعہ میموری کو متحرک طور پر مختص کیا جاتا ہے، تو اسے پھر میموری کو ہٹانا یا ڈیلوکیٹ کرنا پڑتا ہے جب اس کا سورس کوڈ کے مزید عمل میں کوئی فائدہ نہیں ہوتا ہے۔ یہ صورت حال 'میموری لیک' کا سبب بنتی ہے جب پروگرام کو ختم کر دیا جاتا ہے جبکہ میموری کو ڈی ایلوکیٹ نہیں کیا جاتا ہے۔







متحرک مختص کے لیے آپریٹرز

C++ میں، دو آپریٹرز میموری ایلوکیشن اور ڈیل لوکیشن میں مدد کرتے ہیں: 'نیا' اور 'ڈیلیٹ' جو میموری کو بہتر طریقے سے مختص کرنے اور ڈیل لوکیشن کے لیے استعمال کیا جاتا ہے۔



نیا آپریٹر

یہ میموری مختص کرنے کے مطالبے کی نشاندہی کرتا ہے۔ نیا آپریٹر میموری کو شروع کرتا ہے اور اس مختص میموری کا پتہ پوائنٹر متغیر کو واپس کرتا ہے اگر کافی میموری دستیاب ہے۔



پوائنٹر آبجیکٹ = نئی ڈیٹا - قسم ;

آپریٹر کو حذف کریں۔

بالکل نئے آپریٹر کی طرح، ڈیلیٹ آپریٹر کو مختص میموری کو ہٹانے کے لیے استعمال کیا جاتا ہے۔ C++ میں، پروگرامر اس آپریٹر کو ڈیل لوکیشن کے لیے استعمال کر سکتا ہے۔





# پوائنٹر_متغیر کو حذف کریں؛

مثال 1

اس مثال میں، ہم دو پوائنٹر متعارف کرائیں گے: ایک انٹیجر ٹائپ پوائنٹر ہے اور دوسرا فلوٹ پوائنٹر۔ پوائنٹرز کو ان کے ساتھ ستارے کے نشان کا استعمال کرکے شروع کیا جاتا ہے۔

# Int * pointInt;
# فلوٹ *پوائنٹ فلوٹ؛

ان دو پرنٹرز کا استعمال کرتے ہوئے، ہم متحرک طور پر میموری کو مختص کریں گے۔



متحرک مختص میں پوائنٹرز کا کردار:
اسٹوریج کی جگہ کی میموری بلاکس کی شکل میں تیار کی جاتی ہے۔ جب بھی ہم کسی پروگرام کو چلاتے ہیں یا کوئی آپریشن کرتے ہیں تو میموری اس مخصوص مقصد کے لیے مختص کی جاتی ہے۔ اس میموری کا ایک خاص پتہ ہوتا ہے جو اس پروگرام سے منسلک ہوتا ہے جو اس بات کی نشاندہی کرتا ہے کہ اس میموری کو کون سا پروسیس یا پروگرام کی اجازت ہے۔ کسی بھی میموری سلاٹ تک اس ایڈریس کے ذریعے رسائی حاصل کی جاتی ہے جس سے اس کا تعلق ہے۔ تو اس ایڈریس کو پوائنٹرز کے ذریعے محفوظ کیا جاتا ہے۔ مختصراً، ہمیں میموری تک رسائی کے لیے پوائنٹرز کی ضرورت ہوتی ہے اور اسی طرح کسی بھی کام کے لیے میموری کا ایک مخصوص حصہ مختص کرنے کے لیے۔ پتے ذخیرہ کرنے کے لیے پوائنٹرز کی ضرورت ہے۔

جیسا کہ 'نیا' کلیدی لفظ دستی ایلوکیشن میں میموری کی ڈائنامک ایلوکیشن کے لیے استعمال ہوتا ہے، اس لیے میموری کو کمپائلر کے ذریعے مختص کیا جاتا ہے۔ ہمیں رن ٹائم پر میموری مختص کرنے کی ضرورت نہیں ہے۔ لیکن چونکہ ڈائنامک ایلوکیشن بے ترتیب ہے، ہمیں پوائنٹرز کی شناخت کرنے کی ضرورت ہے اور بائنڈنگ کے عمل کے لیے، یہ نیا آپریٹر استعمال کیا جاتا ہے۔

# پوائنٹ = نیا انٹ؛

اسی طرح فلوٹنگ پوائنٹر بھی اسی طرح پابند ہے۔ بائنڈنگ کے عمل کے بعد، ہم اس میموری کو کوئی قیمت تفویض کریں گے جسے ہم کسی بھی آپریشن کے لیے بک کرنا چاہتے ہیں۔ پوائنٹر کا اعلان کرکے، ہم میموری کو ایک مخصوص قدر تفویض کرتے ہیں۔

# *پوائنٹ انٹ = 50؛

پوائنٹ فلوٹس کے لیے فلوٹ ویلیو کا بھی اعلان کیا جاتا ہے۔ تفویض کرنے کے بعد اقدار دکھائیں۔

جیسا کہ ہم نے تبادلہ خیال کیا ہے، 'نیا' آپریٹر مختص کرنے کے لیے استعمال ہوتا ہے جب کہ 'ڈیلیٹ' میموری کو ڈی ایلوکیٹ کرنے کے لیے استعمال کیا جاتا ہے۔ لہذا ایک بار جب آپ کوڈ میں ٹاسک یا آپریشن مکمل کر لیتے ہیں، تو ہم اس میموری کو ہٹا دیں گے جو ہم نے ٹاسک کے لیے مختص کی ہے۔

بہتر ہے کہ میموری کے اس حصے کو الگ کر دیا جائے تاکہ کوئی دوسرا عمل اس سے فائدہ اٹھا سکے۔ ہم اس مختص کو دونوں پوائنٹرز پر لاگو کریں گے۔

پوائنٹ کو حذف کریں۔ تیرنا ;

ایک بار جب آپ ٹیکسٹ ایڈیٹر پر کوڈ کو محفوظ کر لیتے ہیں، تو Ubuntu ٹرمینل آپ کو فائل کے اندر ایک g++ کمپائلر کے ذریعے سورس کوڈ پر عمل کرنے کی اجازت دیتا ہے۔

$g++ -o mem mem.c
$ ./mem

عمل درآمد کے بعد، آپ میموری کو تفویض کردہ اقدار دیکھیں گے۔

مثال 2

اس مثال میں صارف کی بات چیت کا عمل دخل ہے۔ ہم ایک عدد متغیر لیں گے جس میں صارف کی طرف سے ایک قدر ہوگی۔ یہ پروگرام طلباء کے جی پی اے میں نتیجہ محفوظ کرے گا۔ تمام نتائج رن ٹائم پر محفوظ ہو جائیں گے۔

جب صارف طلباء کی تعداد درج کرتا ہے تو ہر نمبر کے مقابلے میں میموری مختص کی جاتی ہے۔ یہاں ایک فلوٹ ٹائپ پوائنٹر شروع کیا گیا ہے جو نتائج کی میموری ایلوکیشن میں استعمال ہوگا۔

ہم پوائنٹر کو فلوٹ میں لیتے ہیں کیونکہ GPA اعشاریہ اشارے میں ہے۔ ہم GPA کے لیے ایک پوائنٹر قسم کی صفیں لیتے ہیں کیونکہ اس کا نتیجہ بہت سے طلبہ کو مل سکتا ہے۔

پی ٹی آر = نئی تیرنا [ ایک پر ]

'نئے' کلیدی لفظ کے ساتھ یہ پوائنٹر سرنی میموری کے ساتھ عملدرآمد کو باندھ دے گی۔ ہر طالب علم کے لیے جی پی اے درج کیا جائے گا۔ چونکہ ہم ان طلباء کی تعداد سے واقف نہیں ہیں جو صارف شامل کرنا چاہتا ہے، ہم نے داخل کردہ نمبر تک GPA داخل کرنے کے لیے ایک لوپ کا استعمال کیا۔ لوپ کی ہر تکرار میں، صارف سے طالب علم کی شناخت کرتے ہوئے نتیجہ درج کرنے کے لیے کہا جاتا ہے۔ نتیجہ محفوظ ہوجانے کے بعد، ہم طلباء کے تمام GPAs کو ظاہر کرنے کے لیے دوبارہ ایک لوپ کا استعمال کریں گے۔ آخر میں، پوائنٹر قسم کی صف کو حذف کر دیا جاتا ہے، کیونکہ متحرک اسٹوریج کا مقصد پورا ہو گیا تھا۔

حذف کریں۔ [ ] ptr ;

اب ہم اوپر بیان کردہ کوڈ پر عمل کریں گے۔ صارف سے پہلے طلباء کی تعداد درج کرنے کی درخواست کی جائے گی۔ پھر ہر طالب علم کا جی پی اے درج کیا جائے گا۔

مثال 3

یہ مثال کلاس کے آبجیکٹ کے لیے نئے اور ڈیلیٹ آپریٹرز کا استعمال کرتی ہے۔ اس کلاس میں عددی قسم کا ایک نجی متغیر ہوتا ہے جو عمر کو محفوظ کرتا ہے۔ ایک کلاس کے عوامی حصے میں، کنسٹرکٹر بنایا جاتا ہے جو عمر کو '10' نمبر پر شروع کرے گا۔ یہاں ایک اور فنکشن استعمال ہوتا ہے جو کنسٹرکٹر میں شروع ہونے والی عمر کو ظاہر کرے گا۔

اب ہم ڈائنامک ایلوکیشن کے لیے مرکزی پروگرام کی طرف جائیں گے۔ کلاس کا آبجیکٹ متحرک طور پر بنایا گیا ہے۔

طالب علم * ptr = نئی طالب علم ( ) ;

جب آبجیکٹ بن جائے گا تو کنسٹرکٹر خود بخود نافذ ہو جائے گا۔ عمر معلوم کرنے کے لیے ایک فنکشن کال کی جائے گی۔ یہ ptr کے ذریعے کیا جائے گا۔

پی ٹی آر - > عمر حاصل کریں۔ ( ) ;

اور آخر میں، میموری جاری کیا جائے گا.

نتیجہ

ڈائنامک میموری ایلوکیشن رن ٹائم ایگزیکیوشن پر پروگرامر کے ذریعہ مرتب کی گئی مقررہ اسٹوریج کے بجائے مختص کی جاتی ہے۔ یہ مختص ایک بے ترتیب بنیاد پر ہے اور اسے استعمال کرنے کے بعد ختم کیا جا سکتا ہے۔ جبکہ، زیادہ تر صورتوں میں، ہٹانے سے پہلے، عملدرآمد کا عمل رک جاتا ہے اور یہ متحرک مختص پھر میموری لیک ہونے کا سبب بنتا ہے۔ ہم نے اس رجحان کو اوبنٹو لینکس سسٹم میں C++ پروگرامنگ زبان کا استعمال کرتے ہوئے مختلف طریقوں سے لاگو کیا ہے۔