unique_ptr
ไม่สามารถคัดลอกได้สามารถเคลื่อนย้ายได้เท่านั้น
สิ่งนี้จะส่งผลโดยตรงต่อการทดสอบซึ่งในตัวอย่างที่สองของคุณจะย้ายได้และไม่สามารถคัดลอกได้
ในความเป็นจริงมันเป็นการดีที่คุณใช้unique_ptr
ซึ่งช่วยปกป้องคุณจากความผิดพลาดครั้งใหญ่
ตัวอย่างเช่นปัญหาหลักเกี่ยวกับรหัสแรกของคุณคือตัวชี้จะไม่ถูกลบซึ่งแย่มากจริงๆ พูดว่าคุณจะแก้ไขได้โดย:
class Test
{
int* ptr; // writing this in one line is meh, not sure if even standard C++
Test() : ptr(new int(10)) {}
~Test() {delete ptr;}
};
int main()
{
Test o;
Test t = o;
}
นี่ก็แย่เหมือนกัน จะเกิดอะไรขึ้นถ้าคุณคัดลอกTest
? จะมีสองคลาสที่มีพอยน์เตอร์ที่ชี้ไปยังที่อยู่เดียวกัน
เมื่อตัวหนึ่งTest
ถูกทำลายก็จะทำลายตัวชี้ด้วย เมื่อวินาทีของคุณTest
ถูกทำลายระบบจะพยายามลบหน่วยความจำที่อยู่ด้านหลังตัวชี้ด้วย แต่มันถูกลบไปแล้วและเราจะได้รับข้อผิดพลาดรันไทม์การเข้าถึงหน่วยความจำที่ไม่ดี (หรือพฤติกรรมที่ไม่ได้กำหนดหากเราโชคไม่ดี)
ดังนั้นวิธีที่ถูกต้องคือใช้ตัวสร้างการคัดลอกและตัวดำเนินการกำหนดสำเนาเพื่อให้พฤติกรรมนั้นชัดเจนและเราสามารถสร้างสำเนาได้
unique_ptr
อยู่ข้างหน้าเราที่นี่ มันมีความหมายเชิงความหมาย: " ฉันเป็นunique
ดังนั้นคุณไม่สามารถคัดลอกฉันได้ " ดังนั้นจึงป้องกันไม่ให้เราผิดพลาดในการใช้ตัวดำเนินการที่อยู่ในมือ
คุณสามารถกำหนดตัวสร้างการคัดลอกและตัวดำเนินการกำหนดสำเนาสำหรับพฤติกรรมพิเศษและรหัสของคุณจะทำงาน แต่คุณถูกต้อง (!) ถูกบังคับให้ทำเช่นนั้น
คุณธรรมของเรื่องราว: ใช้unique_ptr
ในสถานการณ์แบบนี้เสมอ