سؤال

هل من الممكن لقطعة من مستخدم LUA أن تضع إشارة إلى كائن LUA؟ (مثل الجدول ، أو قطعة أخرى من userData؟). في الأساس ، ما أريد معرفته هو:

هل يمكنني إنشاء جزء من userData بطريقة تاه عند تشغيل GC ، يمكن لبيانات المستخدم أن تقول: "مهلا! أنا أحمل إشارات إلى هذه الكائنات الأخرى ، قم بتمييزها أيضًا."

تحرير: الرد على LHF:

افترض أن لدي:

struct Vertex {
  double x, y, z;
}

struct Quaternion {
  double w, x, y, z;
}

الآن ، يمكنني أن أفعل:

struct Foo {
  Vertex v;
  Quaternion q;
}

لكن لنفترض بدلاً من ذلك أريد:

struct Bar {
  Vertex *v;
  Quaternion *q;
}

أي لنفترض أن Vertex & Quaternion هي حقًا قطع كبيرة من userData].

الآن ، لنفترض أن لدي وظيفة مستخدم LUA التي تأخذ userdata vertex ، و userdata quaternion ، وإنشاء شريط userdata (لا أريد المستخدم foo لأنني أريد حفظ المساحة) - ثم أحتاج بطريقة ما إلى userData Vertex*/Quaternion* حتى لا يكون GC-ED.

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

المحلول

هل من الممكن لبيانات مستخدم LUA الاحتفاظ بالرجوع إلى كائن LUA؟

لا. لا يمكن لـ userData الاحتفاظ بمؤشر إلى كائن LUA آخر. إذا كنت ترغب في استخدام userData للحفاظ على كائن LUA آخر على قيد الحياة ، فيجب عليك القيام بذلك باستخدام طاولات ضعيفة. كتاب روبرتو كـ قسم حول كيفية القيام بذلك.

نصائح أخرى

كانت بعض الوقت منذ أن فعلت أي شيء مع لوا. أعتقد أنه إذا تم إنشاء البيانات المشار إليها بواسطة آلة LUA ، فستقوم بتنظيفها بنفسها. وإلا يجب أن تنتظر رد اتصال GC في رمز C الخاص بك وتحرير الذاكرة بنفسك.

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