ค้นหาบล็อกนี้

วันอาทิตย์ที่ 25 เมษายน พ.ศ. 2553

Reference counted object:: 5 Rules

Reference counted object ->จะจัดหาขอบเขตของการแก้ปัญหาของobjในการจองหน่วยความจำบน heap(ด้วยคำสั่ง new) คำถามต่อมาก็คือเราจะลบมันหรือเคลียร์ หน่วยความจำตรงนั้นอย่างไร ซึ่งสามารถทำได้โดยการให้มี ตัวนับอ้างอิงให้แก่ obj กล่าวคือจะมีการนับเพิ่มขึ้นเมื่อมีการใช้งาน obj นั้นจากภายนอก และจะลดลงเมื่อใช้ เสร็จ เมื่อมีการใช้ครั้งสุดท้าย reference count จะเป็น 0 แล้วobj นั้นก็จะถูกลบไป
แต่การใช้งาน Reference counted object ก็มีข้อที่ควรระวังอยู่เหมือนกัน เนื่องจากเป็นการทำงา่นแบบอัตโนมัติจึงมีกฏในการใช้งานดังนี้ เพื่อให้การทำงานเป็นไปอย่างถูกต้องตามที่ควรจะเป็น
ref_ptr nptr =new osg::Node;
ซึ่งจะต่างจากการประกาศแบบนี้
osg::Node *nptr =new osg::Node; //จะไม่มีการนับการอ้างอิง


Rule Of Thumb #1
Always use ref_ptr<> to point to classes that are derived from Referenced.
กฏข้อนี้จะเป็นการใช้งานร่วมกันระหว่าง ref_ptr กับ standard pointer(*)
กล่าวคือ หากมีการโยนตัวชี้(node*) ไปให้ ref_ptr ชี้ต่อ จะทำให้จากเิดิมที่สร้าง (node*)แล้วทำการ deleteเองซึ่งไม่มีการ นับการอ้างอิง ไปยัง ref_ptr ที่มีการอ้างอิงซึ่งหาก เกิด นับแล้วเป็น 0 ขึ้นมา มีกา่รrelease หน่วยความจำขึ้นมา ก็...ซวย
Node *n=new Node();
ref_ptr ptr= n;
ปล.ในscope เดียวกัน อาจไม่เกิดปัญหา แต่ถ้าโยนข้าม scope เกิดปัญหาถ้าไม่มีการดักไว้ก่อน



Rule Of Thumb #2

Never return the address ref_ptr<> points to in the return value of a function. Return the ref_ptr<> itself.
ไม่ให้มีการรีเทิร์นค่าของที่อยู่ ที่ref_ptr ชี้อยู่ แต่ให้ return pointer จากฟังก์ชันหนึ่งไปยังอีก ref_ptr หนึ่งแทน เนื่องมีการ returm ค่าที่ref_ptr.get();จะมีการนับการอ้างอิง ทำให้เมื่อ return ตัวแปรref_ptr ของตัวส่งไม่เป็น0 จึงไม่ถูกลบ

Rule Of Thumb #3
Never use ref() or unref(), (or release(), or unref_nodelete()) unless you really, really, (really) know what you are doing. ค่อนข้างตรงตัวใช้ ref(),ฯลฯ เมื่อเรามั่นใจและรู้ว่ากำลังทำอะไร เนื่องจากการใช้ ref_ptr ในการจัดการแบบอัตโนมัติทำให้มีบางกรณีืั้ที่ไม่ตรงกับความหมายหรือค่าที่ควรจะเป็นจึงต้องมีการใช้การนับด้วยการใช้ฟังก์ชัน ref()หรือ unref() เองบ้างซึ่งควรระวังในการใช้งานด้วย

Rule Of Thumb #4
When subclassing from Referenced (directly or indirectly), always protect the destructor so the object cannot be allocated on the stack.
เมื่อมีการทำ subclass จาก Referenced โดยทางตรงหรืออ้อม จะมีการป้องกันการลบด้วย destructor
และไม่ให้มีการ ref_ptr แก่obj ที่จองหน่วยความจำบน stackgเช่น สร้างclass A(){};แล้วมีการส่ง&ของobjที่เป็น A a; แล้วส่งไปให้ฟังก์ชันที่ีมีการรับด้วยref_ptr

Rule Of Thumb #5
Exception to Rule Of Thumb #1

If circular referencing is possible, it is necessary to carefully use simple pointers when it is known that the the object will be referenced by another ref_ptr in the current scope.
ในบางกรณีหากการอ้างอิงการนับของเราไม่้ได้0หรือไม่มีการrelease memory ทั้งที่ควรจะทำ เราสามารถแหกกฎข้อ 1 ได้โดยการใช้ pointer ธรรมดาในการอ้างอิงแทนที่จะใช้ ref_ptr

ไม่มีความคิดเห็น:

แสดงความคิดเห็น