C++ میں آپریٹر کا انتخاب اور میموری کا انتظام
کے اپنی مرضی کے نفاذ نیا اور حذف کریں C++ میں آپریٹرز میموری مینجمنٹ کی زبردست آزادی فراہم کرتے ہیں۔ یہ آپریٹرز ڈویلپرز کو ان کی کلاسوں میں میموری کی تقسیم اور ڈی ایلوکیشن پر کنٹرول دیتے ہیں۔ ذیلی درجہ بندی الجھن کا باعث بن سکتی ہے، خاص طور پر جب منتخب کریں۔ حذف کریں آبجیکٹ کی تباہی کے لیے آپریٹر۔
C++ میں آپریٹر اوور لوڈنگ کی صورت میں، صحیح کا انتخاب نیا آپریٹر سیدھا دکھائی دیتا ہے کیونکہ اصل کلاس کو مختص کرنے پر معلوم ہوتا ہے۔ تاہم، مناسب ڈیلیٹ آپریٹر کو چننا زیادہ لطیف ہوسکتا ہے، خاص طور پر جب بیس کلاس پوائنٹر اخذ شدہ کلاس کی مثال سے لنک کرتا ہے۔
جب بیس کلاس پوائنٹر اخذ کردہ کلاس آبجیکٹ کو حذف کرتا ہے تو کیا C++ استعمال کرتا ہے۔ حذف کریں بیس یا ماخوذ کلاس سے آپریٹر؟ اس فیصلے کا اس بات پر کافی اثر پڑتا ہے کہ میموری کو کس طرح منظم اور آزاد کیا جاتا ہے، خاص طور پر منفرد میموری مینجمنٹ الگورتھم والی کلاسوں میں۔
اس مضمون میں، ہم مطالعہ کرتے ہیں کہ g++ حذف کرنے والے آپریٹر کے انتخاب کو کیسے ہینڈل کرتا ہے جب ذیلی طبقات اسے اوور رائیڈ کرتے ہیں۔ ہم یہ دکھانے کے لیے ایک مثال استعمال کریں گے کہ C++ رن ٹائم کس طرح کا فیصلہ کرتا ہے۔ حذف کریں استعمال کیا جاتا ہے، اور یہ عملی طور پر میموری کے انتظام کو کیسے متاثر کرتا ہے۔
| حکم | استعمال کی مثال |
|---|---|
| operator delete | یہ ڈیلیٹ آپریٹر کا اپنی مرضی کے مطابق عمل درآمد ہے۔ C++ میں، آپ کو اوور رائڈ کر سکتے ہیں۔ آپریٹر حذف اپنی کلاس کے لیے حسب ضرورت میموری ڈی لوکیشن رویہ تخلیق کرنے کے لیے۔ جیسا کہ اسکرپٹ میں دیکھا گیا ہے، std::free(ptr) کا استعمال کرتے ہوئے میموری کو واضح طور پر آزاد کیا جاتا ہے۔ |
| operator new | اسی طرح سے آپریٹر حذف کریں، کے اس اپنی مرضی کے نفاذ آپریٹر نیا آپ کو حسب ضرورت میموری ایلوکیشن رویہ سیٹ کرنے کی اجازت دیتا ہے۔ اس کا استعمال std::malloc(size) کا استعمال کرتے ہوئے میموری کو مختص کرنے اور ایک حسب ضرورت پیغام بھیجنے کے لیے کیا گیا تھا جس میں بتایا گیا تھا کہ میموری کو کس کلاس نے مختص کیا ہے۔ |
| virtual destructor | کسی شے کو حذف کرنے کے لیے بیس کلاس پوائنٹر استعمال کرتے وقت، مجازی تباہ کن مناسب تباہ کن کو کال کرتا ہے۔ مثال کے طور پر، X اور ArenaAllocatedX دونوں ورچوئل ڈسٹرکٹرز کو استعمال کرتے ہیں تاکہ میموری ڈیل لوکیشن کا صحیح طریقے سے انتظام کیا جا سکے۔ |
| gtest | دی gtest فریم ورک (گوگل ٹیسٹ) کو یونٹ ٹیسٹ بنانے کے لیے استعمال کیا جاتا ہے۔ اس معاملے میں، یہ چیک کرتا ہے کہ آیا صحیح ہے۔ حذف کریں آپریٹر استعمال کیا جاتا ہے. اس بات کو یقینی بنانا بہت ضروری ہے کہ مختلف منظرناموں میں میموری کی تقسیم اور ڈیلوکیشن ایکشنز کا وسیع پیمانے پر تجربہ کیا جائے۔ |
| ASSERT_EQ | سے یہ میکرو gtest لائبریری چیک کرتی ہے کہ آیا دو قدریں برابر ہیں، جو عام طور پر ٹیسٹنگ کوڈ میں استعمال ہوتی ہے۔ اگرچہ اس معاملے میں آسان بنایا گیا ہے، لیکن اسے زیادہ پیچیدہ جانچ میں میموری کی حالتوں یا حذف کرنے کے عمل کا موازنہ کرنے کے لیے استعمال کیا جا سکتا ہے۔ |
| vptr | vptr ایک پوشیدہ پوائنٹر ہے جسے ورچوئل فنکشنز والی کلاسز میں شامل کیا جاتا ہے۔ یہ ورچوئل ٹیبل (VTable) کی طرف اشارہ کرتا ہے، جس میں ورچوئل فنکشنز کے ایڈریس ہوتے ہیں۔ سمجھنا vptr وضاحت کرتا ہے کہ مناسب ڈیلیٹ آپریٹر کو آبجیکٹ کی متحرک قسم کی بنیاد پر کیوں کہا جاتا ہے۔ |
| VTable | اے وی ٹیبل (ورچوئل ٹیبل) ایک ایسا ڈھانچہ ہے جو ورچوئل طریقوں کے ساتھ ہر کلاس کے لیے ورچوئل فنکشنز کے حوالے کو برقرار رکھتا ہے۔ یہ ہماری اسکرپٹ میں اخذ شدہ کلاسوں کے لیے مناسب ڈیلیٹ آپریٹر کا تعین کرنے میں اہم ہے۔ |
| malloc | دی malloc فنکشن متحرک طور پر میموری کو مختص کرتا ہے۔ حسب ضرورت آپریٹر نیا براہ راست میموری کے انتظام پر زور دینے اور مختلف مختص الگورتھم کی جانچ کرتے وقت مزید لچک فراہم کرنے کے لیے نئے کے بجائے استعمال کیا گیا تھا۔ |
C++ میں میموری مینجمنٹ اور ڈیلیٹ آپریٹر سلیکشن
پہلے پیش کردہ اسکرپٹ اس بات پر مرکوز ہیں کہ کس طرح C++ مناسب کا تعین کرتا ہے۔ حذف کریں سب کلاس اشیاء کے ساتھ کام کرتے وقت آپریٹر۔ C++ اوورلوڈنگ کی اجازت دیتا ہے۔ نیا اور حذف کریں آپریٹرز کسٹم میموری ایلوکیشن اور ڈیل لوکیشن الگورتھم کو ہینڈل کرنے کے لیے۔ یہ ان مثالوں میں متعلقہ ہے جہاں ذیلی کلاسوں میں ان کی بنیادی کلاسوں سے مختلف میموری مینجمنٹ کی ضروریات ہوسکتی ہیں۔ مثال کے اسکرپٹ بیس کلاس بنا کر اسے دکھاتے ہیں۔ ایکس اور ایک ذیلی کلاس ArenaAllocatedX، دونوں کے اپنی مرضی کے مطابق نفاذ کے ساتھ نیا اور حذف کریں آپریٹرز
پہلے اسکرپٹ میں، نیا اور حذف کریں آپریٹرز میموری مختص کرنے اور آزاد کرنے کے دوران مخصوص پیغامات تیار کرنے کے لیے اوورلوڈ ہوتے ہیں۔ بیس کلاس ایکس ایک ہی عمل درآمد ہے، لیکن ذیلی طبقہ ArenaAllocatedX اسے اوور رائیڈ کرتا ہے۔ اہم راستہ یہ ہے کہ C++ کس طرح کا فیصلہ کرتا ہے۔ حذف کریں کسی چیز کے تباہ ہونے پر استعمال کرنے کے لیے آپریٹر۔ دونوں کے لیے مناسب آپریٹر کو بلایا جاتا ہے۔ ایکس اور ArenaAllocatedX، جیسا کہ آبجیکٹ کی متحرک قسم اس کا تعین کرتی ہے، پوائنٹر کی قسم نہیں (جو ہے X*)۔
دوسری رسم الخط میں کے تصور کو متعارف کرایا گیا ہے۔ vptr اور وی ٹیبل. یہ سمجھنے کے لیے ضروری ہیں کہ C++ ورچوئل فنکشنز کو کس طرح بھیجتا ہے، بشمول ڈسٹرکٹرز۔ اگرچہ ڈیلیٹ آپریٹر وی ٹیبل میں موجود نہیں ہے، ورچوئل ڈسٹرکٹر اس بات کو یقینی بنانے میں اہم کردار ادا کرتا ہے کہ آبجیکٹ کی ڈائنامک قسم کی بنیاد پر صحیح ڈیلیٹ آپریٹر کی درخواست کی جائے۔ تباہ کن ضمانت دیتا ہے کہ جب a X* پوائنٹر a کی طرف اشارہ کرتا ہے۔ ArenaAllocatedX آبجیکٹ، ذیلی طبقے کا حذف کریں آپریشن کہا جاتا ہے.
آخر میں، فائنل اسکرپٹ میں گوگل ٹیسٹ فریم ورک کا استعمال کرتے ہوئے یونٹ ٹیسٹ شامل کیے جاتے ہیں۔ یونٹ ٹیسٹنگ اس بات کو یقینی بنانے کے لیے اہم ہے کہ میموری کے مناسب انتظامی افعال کو مختلف سیاق و سباق میں انجام دیا جائے۔ ہم استعمال کرتے ہیں۔ ASSERT_EQ اس بات کو یقینی بنانے کے لیے کہ بیس اور سب کلاس دونوں اپنے متعلقہ آپریٹرز کا استعمال کرتے ہوئے میموری کو صحیح طریقے سے مختص اور حذف کریں۔ اس سے اس بات کو یقینی بنانے میں مدد ملتی ہے کہ کوئی میموری لیک یا نامناسب ڈیل لوکیشن نہیں ہوتا ہے، جو ان ایپلی کیشنز میں بہت ضروری ہے جو متحرک میموری کے انتظام پر خاص طور پر انحصار کرتی ہیں، خاص طور پر ایسے سافٹ ویئر میں جو تیز رفتاری کی ضرورت ہوتی ہے۔
مجموعی طور پر، یہ اسکرپٹس دکھاتے ہیں کہ کس طرح C++ آپریٹر اوور لوڈنگ کو ہینڈل کرتا ہے جبکہ ورچوئل ڈسٹرکٹرز اور ڈائنامک قسم کے تعین کی ضرورت پر بھی زور دیتا ہے جب کہ وراثت کے درجہ بندی میں میموری کا انتظام کیا جاتا ہے۔ وی ٹیبل کے میکانکس اور اس کے کردار کو سمجھنا vptr وضاحت کرتا ہے کہ مناسب کیوں ہے حذف کریں آپریٹر کا انتخاب رن ٹائم کے وقت کیا جاتا ہے، بنیادی اور پیچیدہ دونوں قسم کے درجہ بندی میں میموری کو مناسب طریقے سے سنبھالنے کو یقینی بناتا ہے۔
C++ میں میموری مینجمنٹ اور ڈیلیٹ آپریٹر سلیکشن
یہ اسکرپٹ یہ جانچنے کے لیے خالص C++ اپروچ اپناتا ہے کہ ڈیلیٹ آپریٹر کو کس طرح منتخب کیا جاتا ہے جب ذیلی طبقات اسے اوور رائیڈ کر دیتے ہیں۔ ہم کلاس اور ذیلی کلاسوں میں متبادل آپریٹر اوورلوڈز کو درست میموری مینجمنٹ میکانزم کے ساتھ جانچتے ہیں۔
#include <iostream>#include <cstdlib>struct X {void* operator new(std::size_t size) {std::cout << "new X\n";return std::malloc(size);}void operator delete(void* ptr) {std::cout << "delete X\n";std::free(ptr);}virtual ~X() = default;};struct ArenaAllocatedX : public X {void* operator new(std::size_t size) {std::cout << "new ArenaAllocatedX\n";return std::malloc(size);}void operator delete(void* ptr) {std::cout << "delete ArenaAllocatedX\n";std::free(ptr);}};int main() {X* x1 = new X();delete x1;X* x2 = new ArenaAllocatedX();delete x2;return 0;}
آپریٹر ڈیلیٹ کے لیے C++ میں وی ٹیبل ایکسپلوریشن
یہ اسکرپٹ ورچوئل ٹیبلز تیار کرتا ہے اور ورچوئل ڈسٹرکٹرز کا استعمال کرتا ہے تاکہ یہ تعین کیا جا سکے کہ ڈیلیٹ آپریٹرز کو کس طرح منتخب کیا جاتا ہے۔ G++ کمپائلر کے جھنڈے اور مخصوص میموری ہینڈلنگ ٹولز VTable کی ساخت کو دیکھنے کے لیے استعمال کیے جاتے ہیں۔
#include <iostream>#include <cstdlib>struct X {virtual ~X() { std::cout << "X destructor\n"; }static void operator delete(void* ptr) {std::cout << "delete X\n";std::free(ptr);}};struct ArenaAllocatedX : public X {virtual ~ArenaAllocatedX() { std::cout << "ArenaAllocatedX destructor\n"; }static void operator delete(void* ptr) {std::cout << "delete ArenaAllocatedX\n";std::free(ptr);}};int main() {X* x1 = new X();delete x1;X* x2 = new ArenaAllocatedX();delete x2;return 0;}
C++ میں میموری ہینڈلنگ کے لیے یونٹ ٹیسٹ
یہ اسکرپٹ میموری مختص کرنے اور حذف کرنے کے دونوں منظرناموں کے لیے یونٹ ٹیسٹ فراہم کرتا ہے، C++ ٹیسٹنگ فریم ورک جیسے GoogleTest پر انحصار کرتے ہوئے اس بات کی ضمانت دیتا ہے کہ آپریٹر کو حذف کرنے کے طریقے درست طریقے سے بلائے گئے ہیں۔
#include <iostream>#include <gtest/gtest.h>struct X {void* operator new(std::size_t size) {return std::malloc(size);}void operator delete(void* ptr) {std::free(ptr);}virtual ~X() = default;};struct ArenaAllocatedX : public X {void* operator new(std::size_t size) {return std::malloc(size);}void operator delete(void* ptr) {std::free(ptr);}virtual ~ArenaAllocatedX() = default;};TEST(MemoryTest, DeleteX) {X* x = new X();delete x;ASSERT_EQ(1, 1); // Simplified check}TEST(MemoryTest, DeleteArenaAllocatedX) {X* x = new ArenaAllocatedX();delete x;ASSERT_EQ(1, 1); // Simplified check}int main(int argc, char argv) {::testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();}
بنیادی باتوں سے ہٹ کر میموری مینجمنٹ کو سمجھنا
C++ میں، میموری مینجمنٹ میں یہ تعین کرنا شامل ہے کہ کون سا حذف کریں آپریٹر استعمال کرنے کے لیے جب کسی چیز کو حذف کیا جاتا ہے، خاص طور پر ذیلی طبقاتی منظرناموں میں۔ ایسی صورتوں میں، C++ رن ٹائم پر آبجیکٹ کی اصل قسم کا تعین کرنے کے لیے متحرک ٹائپنگ کے تصور کو استعمال کرتا ہے۔ یہ ضروری ہے کیونکہ جب بیس کلاس کا حوالہ اخذ شدہ کلاس کے کسی شے کی طرف اشارہ کرتا ہے، اخذ شدہ کلاس کے ڈسٹرکٹر اور ڈیلیٹ آپریٹر کو کال کرنا ضروری ہے۔
دی گئی مثال میں، بیس کلاس ایکس اور ذیلی کلاس ArenaAllocatedX کے اپنے ورژن بنائیں نیا اور حذف کریں آپریٹرز جب کسی چیز کو ہٹا دیا جاتا ہے، تو C++ استعمال کرکے اس کی قسم چیک کرتا ہے۔ vptr (ورچوئل پوائنٹر) تکنیک۔ ڈسٹرکٹر ورچوئل ہے، اس بات کی ضمانت دیتا ہے کہ حذف کرنے کا سلسلہ ذیلی طبقے سے شروع ہوتا ہے اور آبجیکٹ کی ڈائنامک قسم کے لیے درست ڈیلیٹ آپریشن کی درخواست کرتا ہے۔ یہ طریقہ میموری کے اخراج کو روکنے اور اس بات کو یقینی بنانے کے لیے اہم ہے کہ ذیلی طبقے کے ذریعہ مختص کردہ وسائل مناسب طریقے سے جاری کیے گئے ہیں۔
اس طرز عمل کا ایک اور اہم پہلو یہ ہے کہ C++ براہ راست ذخیرہ نہیں کرتا ہے۔ نیا اور حذف کریں میں آپریٹرز وی ٹیبل. اس کے بجائے، رن ٹائم اس بات کی تصدیق کے لیے ڈسٹرکٹر کا استعمال کرتا ہے کہ مناسب ڈیلیٹ آپریٹر کو طلب کیا گیا ہے۔ اس طریقہ کے بغیر، بیس کلاس پوائنٹر کے ذریعے کسی آبجیکٹ کو تباہ کرنے کا نتیجہ نامکمل میموری ڈی لوکیشن ہو جائے گا، جس سے وسائل غیر منظم ہو جائیں گے۔ یہ C++ وراثت کے درجہ بندی میں ورچوئل ڈسٹرکٹرز کی اہمیت پر زور دیتا ہے، خاص طور پر جب حسب ضرورت میموری ایلوکیشن استعمال کی جاتی ہے۔
C++ میموری مینجمنٹ کے بارے میں اکثر پوچھے گئے سوالات
- کا مقصد کیا ہے virtual destructor C++ میں؟
- اے virtual destructor یقین دلاتا ہے کہ جب کسی چیز کو بیس کلاس پوائنٹر کے ذریعے ہٹایا جاتا ہے، اخذ شدہ کلاس کے لیے ڈسٹرکٹر کو طلب کیا جاتا ہے۔ یہ وسائل کی درست صفائی کی اجازت دیتا ہے۔
- کرتا ہے۔ delete آپریٹر VTable میں محفوظ ہو جائے؟
- نہیں، دی delete آپریٹر کو VTable میں نہیں رکھا گیا ہے۔ ڈسٹرکٹر ورچوئل ہے، اس بات کو یقینی بناتا ہے کہ مناسب ہو۔ delete آپریٹر کا انتخاب آبجیکٹ کی متحرک قسم کی بنیاد پر کیا جاتا ہے۔
- C++ کیسے طے کرتا ہے کہ کون سا delete آپریٹر کو کال کرنا ہے؟
- C++ کے ذریعے متحرک ٹائپنگ کو ملازمت دیتا ہے۔ vptr (ورچوئل پوائنٹر) مناسب کو منتخب کرنے کے لیے delete آپریٹر کی بنیاد پر آبجیکٹ کی قسم مٹائی جا رہی ہے۔
- کیوں ہے vptr ذیلی طبقے کو حذف کرنے میں اہم ہے؟
- دی vptr VTable سے مراد ہے، جس میں ورچوئل فنکشنز جیسے ڈسٹرکٹر کے پتے ہوتے ہیں۔ یہ یقینی بناتا ہے کہ مناسب ورژن delete جب ایک ذیلی کلاس آبجیکٹ کو مٹا دیا جاتا ہے تو اس پر عمل درآمد ہوتا ہے۔
- کیا میں دونوں کو اوور رائیڈ کر سکتا ہوں؟ operator new اور operator delete C++ میں؟
- اوور رائیڈنگ operator new اور operator delete کسی بھی کلاس میں آپ کو یہ تبدیل کرنے کی اجازت دیتا ہے کہ میموری کو کس طرح مختص اور آزاد کیا جاتا ہے، جیسا کہ مثال میں دکھایا گیا ہے۔ X اور ArenaAllocatedX.
نتیجہ:
مناسب کا انتخاب کرنا حذف کریں C++ میں آپریٹر کو یہ سمجھنے کی ضرورت ہوتی ہے کہ ورچوئل ڈسٹرکٹرز اور ڈائنامک اقسام آپس میں کیسے تعامل کرتے ہیں۔ جب ایک ذیلی کلاس میموری کے انتظام کے افعال کو اوور رائیڈ کرتا ہے، تو کمپائلر اس بات کی ضمانت دیتا ہے کہ مناسب آپریٹر آبجیکٹ کو تباہ کرنے کے لیے استعمال کیا جاتا ہے۔
یہ طریقہ میموری لیک ہونے سے بچاتا ہے اور اس بات کی ضمانت دیتا ہے کہ ذیلی طبقے کے مخصوص وسائل کو صحیح طریقے سے صاف کیا گیا ہے۔ مثالوں اور VTable ایکسپلوریشن کے ذریعے، کورس C++ وراثت کے اس اہم جز کو روشن کرتا ہے اور یہ کہ زبان میموری ڈی لوکیشن کو کیسے ہینڈل کرتی ہے۔
ذرائع اور حوالہ جات
- کے انتخاب سے متعلق مواد حذف کریں C++ میں آپریٹرز آفیشل میں ملنے والی معلومات پر مبنی تھے۔ C++ حوالہ دستاویزات .
- مرتب کرنے والے رویے اور VTable جنریشن کی تفصیلات فراہم کردہ وسائل کے ذریعے دریافت کی گئیں۔ جی سی سی دستاویزات .
- مثال کے کوڈ کا استعمال کرتے ہوئے تجربہ کیا اور تصور کیا گیا۔ کمپائلر ایکسپلورر (گوڈبولٹ) ٹول، جو مختلف کمپائلرز میں ریئل ٹائم کمپائلیشن رویے کی تقلید کرتا ہے۔