แต่การใช้งาน Reference counted object ก็มีข้อที่ควรระวังอยู่เหมือนกัน เนื่องจากเป็นการทำงา่นแบบอัตโนมัติจึงมีกฏในการใช้งานดังนี้ เพื่อให้การทำงานเป็นไปอย่างถูกต้องตามที่ควรจะเป็น
ref_ptr
ซึ่งจะต่างจากการประกาศแบบนี้
osg::Node *nptr =new osg::Node; //จะไม่มีการนับการอ้างอิง
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
ปล.ใน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
ไม่มีความคิดเห็น:
แสดงความคิดเห็น