سؤال

ومن خلال تصفحي للانترنت وجدت هذا المشنور, ، والذي يتضمن هذا

"(مكتوب بشكل جيد) C ++ يذهب إلى أبعد الحدود لجعل الكائنات التلقائية المكدس تعمل" تمامًا مثل "البدائيين ، كما هو موضح في نصيحة Stroustrup لـ" Do كما تفعل INTS ".هذا يتطلب الالتزام أكبر بكثير بمبادئ التنمية الموجهة للكائن:فصلك ليس صحيحًا حتى "يعمل" مثل "int ، باتباع" قاعدة الثلاثة "التي تضمن أنه يمكن إنشاء (تمامًا مثل INT) ونسخه وتدميره بشكل صحيح كمكدس تلقائي."

لقد قمت بعمل القليل من كود C وC++، ولكن بشكل عابر، لم يكن هناك أي شيء جدي أبدًا، ولكن لدي فضول فقط، ماذا يعني ذلك بالضبط؟

يمكن للشخص أن يعطي مثالا؟

هل كانت مفيدة؟

المحلول

تتم معالجة كائنات المكدس تلقائيًا بواسطة المترجم.

عند ترك النطاق، يتم حذفه.

{
   obj a;
} // a is destroyed here

عندما تفعل الشيء نفسه مع كائن "جديد"، فإنك تحصل على تسرب للذاكرة:

{
    obj* b = new obj;
}

لم يتم تدمير b، لذلك فقدنا القدرة على استعادة الذاكرة التي يملكها b.وربما الأسوأ من ذلك هو أن الجسم لا يستطيع تنظيف نفسه بنفسه.

في C ما يلي شائع:

{
   FILE* pF = fopen( ... );
   // ... do sth with pF
   fclose( pF );
}

في لغة C++ نكتب هذا:

{
   std::fstream f( ... );
   // do sth with f
} // here f gets auto magically destroyed and the destructor frees the file

عندما ننسى استدعاء fclose في نموذج C، لا يتم إغلاق الملف ولا يجوز استخدامه بواسطة برامج أخرى.(على سبيل المثاللا يمكن حذفه).

مثال آخر يوضح سلسلة الكائن التي يمكن إنشاؤها وتعيينها والتي يتم تدميرها عند الخروج من النطاق.

{
   string v( "bob" );
   string k;

   v = k
   // v now contains "bob"
} // v + k are destroyed here, and any memory used by v + k is freed

نصائح أخرى

بالإضافة إلى الإجابات الأخرى:

تحتوي لغة C++ بالفعل على auto الكلمة الأساسية للإعلان بوضوح عن فئة تخزين الكائن.بالطبع، لا داعي لذلك لأن هذه هي فئة التخزين الضمنية للمتغيرات المحلية ولا يمكن استخدامها في أي مكان.على العكس من auto يكون static (سواء محليا أو عالميا).

الإعلانان التاليان متكافئان:

int main() {
    int a;
    auto int b;
}

نظرًا لأن الكلمة الأساسية عديمة الفائدة تمامًا، فسيتم إعادة تدويرها فعليًا في معيار C++ التالي ("C++0x") وتحصل على معنى جديد، أي أنها تتيح للمترجم استنتاج نوع المتغير من تهيئته (مثل var شركة#):

auto a = std::max(1.0, 4.0); // `a` now has type double.

يمكن الإعلان عن المتغيرات في C++ على المكدس أو الكومة.عندما تعلن عن متغير في لغة C++، فإنه ينتقل تلقائيًا إلى المكدس، ما لم تستخدم العامل الجديد بشكل صريح (ينتقل إلى الكومة).

MyObject x = MyObject(params); // onto the stack

MyObject * y = new MyObject(params); // onto the heap

وهذا يحدث فرقًا كبيرًا في طريقة إدارة الذاكرة.عندما يتم الإعلان عن متغير على المكدس، سيتم إلغاء تخصيصه عندما يخرج عن النطاق.لن يتم تدمير المتغير الموجود في الكومة حتى يتم استدعاء الحذف بشكل صريح على الكائن.

المكدس التلقائي عبارة عن متغيرات يتم تخصيصها في مكدس الطريقة الحالية.الفكرة وراء تصميم فئة يمكن أن تعمل كـ Stack تلقائي هي أنه يجب أن يكون من الممكن تهيئتها بالكامل باستدعاء واحد وتدميرها باستدعاء آخر.من الضروري أن يقوم المدمر بتحرير جميع الموارد المخصصة بواسطة الكائن وأن يقوم منشئه بإرجاع كائن تمت تهيئته بالكامل وجاهز للاستخدام.وبالمثل بالنسبة لعملية النسخ - يجب أن يكون الفصل قادرًا على إنشاء نُسخ بسهولة، وتكون فعالة ومستقلة بالكامل.

يجب أن يكون استخدام هذه الفئة مشابهًا لكيفية استخدام int وfloat وما إلى ذلك.يستخدم.يمكنك تعريفها (في النهاية منحها بعض القيمة الأولية) ثم تمريرها وفي النهاية تترك المترجم للتنظيف.

صحّحوني إذا كنت مخطئًا، لكنني أعتقد أن عملية النسخ ليست إلزامية للاستفادة الكاملة من التنظيف التلقائي للمكدس.على سبيل المثال، ضع في اعتبارك كائن MutexGuard الكلاسيكي، فهو لا يحتاج إلى عملية نسخ ليكون مفيدًا كالمكدس التلقائي، أم أنه لا يحتاج إلى ذلك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top