$lang['tuto'] = "سبق"; ?>$lang['tuto'] = "سبق"; ?>$lang['tuto'] = "سبق"; ?> G++ کے ساتھ ذیلی طبقات میں C++

G++ کے ساتھ ذیلی طبقات میں C++ آپریٹر ڈیلیٹ سلیکشن کو سمجھنا

Delete

C++ میں آپریٹر کا انتخاب اور میموری کا انتظام

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

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

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

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

حکم استعمال کی مثال
operator delete یہ ڈیلیٹ آپریٹر کا اپنی مرضی کے مطابق عمل درآمد ہے۔ C++ میں، آپ کو اوور رائڈ کر سکتے ہیں۔ اپنی کلاس کے لیے حسب ضرورت میموری ڈی لوکیشن رویہ تخلیق کرنے کے لیے۔ جیسا کہ اسکرپٹ میں دیکھا گیا ہے، std::free(ptr) کا استعمال کرتے ہوئے میموری کو واضح طور پر آزاد کیا جاتا ہے۔
operator new اسی طرح سے ، کے اس اپنی مرضی کے نفاذ آپ کو حسب ضرورت میموری ایلوکیشن رویہ سیٹ کرنے کی اجازت دیتا ہے۔ اس کا استعمال std::malloc(size) کا استعمال کرتے ہوئے میموری کو مختص کرنے اور ایک حسب ضرورت پیغام بھیجنے کے لیے کیا گیا تھا جس میں بتایا گیا تھا کہ میموری کو کس کلاس نے مختص کیا ہے۔
virtual destructor کسی شے کو حذف کرنے کے لیے بیس کلاس پوائنٹر استعمال کرتے وقت، مناسب تباہ کن کو کال کرتا ہے۔ مثال کے طور پر، X اور ArenaAllocatedX دونوں ورچوئل ڈسٹرکٹرز کو استعمال کرتے ہیں تاکہ میموری ڈیل لوکیشن کا صحیح طریقے سے انتظام کیا جا سکے۔
gtest دی فریم ورک (گوگل ٹیسٹ) کو یونٹ ٹیسٹ بنانے کے لیے استعمال کیا جاتا ہے۔ اس معاملے میں، یہ چیک کرتا ہے کہ آیا صحیح ہے۔ آپریٹر استعمال کیا جاتا ہے. اس بات کو یقینی بنانا بہت ضروری ہے کہ مختلف منظرناموں میں میموری کی تقسیم اور ڈیلوکیشن ایکشنز کا وسیع پیمانے پر تجربہ کیا جائے۔
ASSERT_EQ سے یہ میکرو لائبریری چیک کرتی ہے کہ آیا دو قدریں برابر ہیں، جو عام طور پر ٹیسٹنگ کوڈ میں استعمال ہوتی ہے۔ اگرچہ اس معاملے میں آسان بنایا گیا ہے، لیکن اسے زیادہ پیچیدہ جانچ میں میموری کی حالتوں یا حذف کرنے کے عمل کا موازنہ کرنے کے لیے استعمال کیا جا سکتا ہے۔
vptr vptr ایک پوشیدہ پوائنٹر ہے جسے ورچوئل فنکشنز والی کلاسز میں شامل کیا جاتا ہے۔ یہ ورچوئل ٹیبل (VTable) کی طرف اشارہ کرتا ہے، جس میں ورچوئل فنکشنز کے ایڈریس ہوتے ہیں۔ سمجھنا وضاحت کرتا ہے کہ مناسب ڈیلیٹ آپریٹر کو آبجیکٹ کی متحرک قسم کی بنیاد پر کیوں کہا جاتا ہے۔
VTable اے (ورچوئل ٹیبل) ایک ایسا ڈھانچہ ہے جو ورچوئل طریقوں کے ساتھ ہر کلاس کے لیے ورچوئل فنکشنز کے حوالے کو برقرار رکھتا ہے۔ یہ ہماری اسکرپٹ میں اخذ شدہ کلاسوں کے لیے مناسب ڈیلیٹ آپریٹر کا تعین کرنے میں اہم ہے۔
malloc دی فنکشن متحرک طور پر میموری کو مختص کرتا ہے۔ حسب ضرورت براہ راست میموری کے انتظام پر زور دینے اور مختلف مختص الگورتھم کی جانچ کرتے وقت مزید لچک فراہم کرنے کے لیے نئے کے بجائے استعمال کیا گیا تھا۔

C++ میں میموری مینجمنٹ اور ڈیلیٹ آپریٹر سلیکشن

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

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

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

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

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

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++ رن ٹائم پر آبجیکٹ کی اصل قسم کا تعین کرنے کے لیے متحرک ٹائپنگ کے تصور کو استعمال کرتا ہے۔ یہ ضروری ہے کیونکہ جب بیس کلاس کا حوالہ اخذ شدہ کلاس کے کسی شے کی طرف اشارہ کرتا ہے، اخذ شدہ کلاس کے ڈسٹرکٹر اور ڈیلیٹ آپریٹر کو کال کرنا ضروری ہے۔

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

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

C++ میموری مینجمنٹ کے بارے میں اکثر پوچھے گئے سوالات

  1. کا مقصد کیا ہے C++ میں؟
  2. اے یقین دلاتا ہے کہ جب کسی چیز کو بیس کلاس پوائنٹر کے ذریعے ہٹایا جاتا ہے، اخذ شدہ کلاس کے لیے ڈسٹرکٹر کو طلب کیا جاتا ہے۔ یہ وسائل کی درست صفائی کی اجازت دیتا ہے۔
  3. کرتا ہے۔ آپریٹر VTable میں محفوظ ہو جائے؟
  4. نہیں، دی آپریٹر کو VTable میں نہیں رکھا گیا ہے۔ ڈسٹرکٹر ورچوئل ہے، اس بات کو یقینی بناتا ہے کہ مناسب ہو۔ آپریٹر کا انتخاب آبجیکٹ کی متحرک قسم کی بنیاد پر کیا جاتا ہے۔
  5. C++ کیسے طے کرتا ہے کہ کون سا آپریٹر کو کال کرنا ہے؟
  6. C++ کے ذریعے متحرک ٹائپنگ کو ملازمت دیتا ہے۔ (ورچوئل پوائنٹر) مناسب کو منتخب کرنے کے لیے آپریٹر کی بنیاد پر آبجیکٹ کی قسم مٹائی جا رہی ہے۔
  7. کیوں ہے ذیلی طبقے کو حذف کرنے میں اہم ہے؟
  8. دی VTable سے مراد ہے، جس میں ورچوئل فنکشنز جیسے ڈسٹرکٹر کے پتے ہوتے ہیں۔ یہ یقینی بناتا ہے کہ مناسب ورژن جب ایک ذیلی کلاس آبجیکٹ کو مٹا دیا جاتا ہے تو اس پر عمل درآمد ہوتا ہے۔
  9. کیا میں دونوں کو اوور رائیڈ کر سکتا ہوں؟ اور C++ میں؟
  10. اوور رائیڈنگ اور کسی بھی کلاس میں آپ کو یہ تبدیل کرنے کی اجازت دیتا ہے کہ میموری کو کس طرح مختص اور آزاد کیا جاتا ہے، جیسا کہ مثال میں دکھایا گیا ہے۔ اور ArenaAllocatedX.

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

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

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