عودة عناوين الكائنات التي تم إنشاؤها خارج الرئيسي () وظيفة

StackOverflow https://stackoverflow.com/questions/607677

  •  03-07-2019
  •  | 
  •  

سؤال

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

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

المحلول

إنشاء الكائنات مع المشغل الجديد. أي

void foo( myObject* bar1, myObject* bar2 )
{
  bar1 = new myObject();
  bar2 = new myObject();
  // do something
}

int main( int argc, char* argv[] )
{
  myObject* thing1;
  myObject* thing2;
  foo( thing1, thing2 );

  // Don't forget to release the memory!
  delete thing1;
  delete thing2;

  return 0;
}

نصائح أخرى

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

إذا كنت لا تريد التعامل مع متاعب والحشرات التي تأتي مع مؤشرات، انظر> وأ href = "http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/shared_ptr.htm "يختلط =" نوفولو noreferrer "> دفعة :: shared_ptr بدلا من ذلك.

واستخدام عامل التشغيل الجديد:

void f()
{
  CMyObject *p = new CMyObject();
  List.AddTail(p); // Or whatever call adds the opbject to the list
}

وإيلاء الاهتمام ليعترض الحذف عندما يتم تدمير قائمتك.

لماذا لا تقوم بتخزين الأشياء (لا مؤشرات إلى الكائنات) في القائمة؟ سوف الخالق الدالة بإرجاع كائن.

إذا كنت حقا بحاجة قائمة مؤشرات النظر في استخدام حاويات قائمة مؤشر الخاصة (boost::ptr_list) أو تخزين مؤشرات الذكية في ذلك (boost::shared_ptr). لمنع كائنات الخروج من نطاق بعد عودته من وظيفة، تحتاج إلى تخصيص لهم حيوي مع المشغل الجديد.

والجواب المقبول ليست صحيحة. في وظيفة

void foo( myObject* bar1, myObject* bar2 )
{
  bar1 = new myObject();
  bar2 = new myObject();
  // do something
}

ويتم تعيين الكائن المخصصة حديثا إلى المتغيرات المحلية. أنها لا تؤثر على قيم المؤشرات في وظيفة الدعوة.

int main( int argc, char* argv[] )
{
  myObject* thing1;
  myObject* thing2;
  foo( thing1, thing2 ); // thing1 and thing2 don't get assigned
                         // They continue to be uninitialized in
                         // this function

  // Don't forget to release the memory!
  delete thing1;  // These two deletes will lead to undefined behavior.
  delete thing2;

  return 0;
}

وما تحتاجه هو:

void foo( myObject*& bar1, myObject*& bar2 )
{
  bar1 = new myObject(); // Now the value of the pointers in the calling
  bar2 = new myObject(); // will be changed since the pointers are passed by reference.
  // do something
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top