พูดถึง C++11 แล้ว ฟีเจอร์สำคัญตัวหนึ่งก็คงหนีไม่พ้น smart pointer (ที่ยกมาจาก boost อีกทีนึง) ผมคิดว่าบางคนคงสงสัยว่า เมื่อไหร่ควรใช้ smart pointer และเมื่อไหร่ควรใช้ raw pointer หลายคนคงคิดว่าเราจะใช้ smart pointer แทน raw pointer ได้ทั้งหมด แต่ก็มีบางกรณีที่ถ้าคุณจะใช้ smart pointer แล้วคุณจะเสียใจ 🙂
(จะพูดอ้อมค้อมทำไมหว่า ?)
smart pointer นั้นออกแบบมาให้เก็บค่า reference ไปยังวัตถุที่อยู่ใน heap ถ้าคุณดันเอาไปใช้กับวัตถุที่อยู่ใน stack เช่น …
int a = 50;
if (a) {
std::shared_ptr<int> ptr(&50);
}
เมื่อจบสโคปภายใต้ if
statement แล้ว destructor ของ ptr
จะถูกเรียก ซึ่งมันก็จะไปทำลายวัตถุที่ตัวมันชี้ไป ปัญหาคือวัตถุที่มันไปทำลายมันอยู่ใน stack และสิ่งที่จะเกิดขึ้นนั้น…ผมก็ไม่รู้ (ถ้าโชคดีโปรแกรมก็พัง เท่านั้นเอง)
ดังนั้นกรณีนี้จะใช้ smart pointer ไม่ได้นะครับ
ส่วนตัวผมจะใช้ raw pointer ในการเก็บ reference ของวัตถุใน stack เอาไว้ใน container เพื่อการเอาไปทำอะไรสักอย่าง คือเราไม่สามารถสร้าง container สำหรับ reference ได้ เราก็เลยใช้ container ของ pointer มาเก็บ reference ของวัตถุแทนนั่นเองครับ
โปรแกรมเมอร์ C++ และผู้นิยมดนตรี