کیوٹ سمارٹ پوائنٹر - کیو شارڈ پوائنٹر

Qt Smart Pointer Qsharedpointer



آرٹیکل ڈائرکٹری

پیش لفظ

کیوٹ سمارٹ پوائنٹر کیو شارڈ پوائنٹر میں وہی فنکشن ہے جو سی ++ میں اسٹڈی :: شیئرڈ_پیٹر کی طرح ہے ، اور اس کی درخواست کی حد اس سے کہیں زیادہ ہے جو ہم نے پہلے کہا تھا۔ کیو پوائنٹر کے ساتھ QScopedPointer زیادہ وسیع۔

QSharedPointer

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



نام نہاد گنتی کا اشارہ ، یعنی داخلی QSharedPointer سے مراد داخلی QSharedPointer کی ملکیت میموری کے وسائل ہیں۔ مثال کے طور پر ، اگر 3 QSharedPointers ایک ہی وقت میں کسی میموری وسائل کی طرف اشارہ کرتے ہیں ، تو 3 گنیں ، جان لیں کہ حوالہ گنتی 0 پر گرتی ہے ، پھر خود بخود میموری کو خارج کردیتی ہے۔ .



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



آئیے ایک سرکاری مثال دیکھیں:

static void doDeleteLater(MyObject *obj) { obj->deleteLater() } void otherFunction() { QSharedPointer obj = QSharedPointer(new MyObject, doDeleteLater) // continue using obj obj.clear() // calls obj->deleteLater() }

اس مثال میں ، کسٹم ڈیلیٹ کرنے کے لئے ایک فنکشن پاس کیا جاتا ہے۔

آپ ممبران کے افعال کو بھی براہ راست استعمال کرسکتے ہیں:



QSharedPointer obj = QSharedPointer(new MyObject, &QObject::deleteLater)

QSharedPointer استعمال کرنے میں بہت آسان ہے ، یہ سیدھے عام پوائنٹرز کی طرح استعمال ہوتا ہے۔ اسے تخلیق کے بعد براہ راست استعمال کیا جاسکتا ہے ، اور بعد میں استعمال نہیں ہوگا۔

آئیے ایک آسان سی مثال دیکھیں جو خود نے لکھی ہے۔

class Student : public QObject { Q_OBJECT public: Student(QObject * parent = nullptr) ~Student() } class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0) ~Widget() private: QSharedPointer m_pStudent } #include 'widget.h' #include Widget::Widget(QWidget *parent) : QWidget(parent) { qDebug() << __FUNCTION__ m_pStudent = QSharedPointer(new Student()) } Widget::~Widget() { qDebug() << __FUNCTION__ } Student::Student(QObject *parent): QObject (parent) { qDebug() << __FUNCTION__ } Student::~Student() { qDebug() << __FUNCTION__ }

چلانے کے بعد ونڈو کو بند کریں ، آؤٹ پٹ:

Widget Student ~Widget ~Student

جیسا کہ آپ دیکھ سکتے ہیں ، طالب علمی آبجیکٹ خودبخود جاری ہوجاتی ہے۔

بات کرنے کے قابل ہے

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

پھر بھی مندرجہ بالا مثال کے طور پر ، تبدیلیاں یہ ہیں:

m_pStudent = QSharedPointer(new Student(this))

پیرنٹ آبجیکٹ اس وقت متعین ہوتا ہے جب نیا ہوتا ہے

چلانے کے بعد ونڈو کو بند کرنا معمول کی بات ہے۔ میں Qt5.11.1 استعمال کر رہا ہوں

وضاحت کریں کہ ان برسوں میں کیوٹ اپ ڈیٹس نے اس مسئلے کو حل کیا ہے۔ تب ہم استعمال کرنے کے عمل میں کم دیکھ بھال استعمال کرسکتے ہیں ، اور اسے اعتماد کے ساتھ استعمال کرسکتے ہیں۔

ٹھیک ہے ، مزید دستاویزات ، حوالہ سرکاری تعارف