C ++ shared_ptr

C Shared_ptr



NS shared_ptr เป็นสมาร์ทพอยน์เตอร์ชนิดหนึ่งของ C++ ที่มีความเป็นเจ้าของร่วมกันของวัตถุที่สร้างโดยตัวชี้ โดยจะแบ่งปันความเป็นเจ้าของของวัตถุเมื่อจัดเก็บตัวชี้ไปยังวัตถุอื่น และตัวนับการอ้างอิงที่ใช้ร่วมกันจะนับจำนวนเจ้าของ NS shared_ptr เพิ่มตัวนับอ้างอิงหนึ่งตัวหลังจากคัดลอกวัตถุและลดตัวนับอ้างอิงหนึ่งตัวหลังจากทำลายวัตถุ หน่วยความจำที่เป็นเจ้าของโดยอ็อบเจ็กต์จะถูกจัดสรรใหม่หากอ็อบเจ็กต์ที่ Last . เป็นเจ้าของ shared_ptr ถูกทำลายหรือ รีเซ็ต() ฟังก์ชันถูกเรียกเพื่อกำหนดตัวชี้อื่นสำหรับวัตถุ เมื่อ shared_ptr ไม่ได้เป็นเจ้าของวัตถุใด ๆ จากนั้นจึงเรียกว่าตัวชี้ที่ใช้ร่วมกันที่ว่างเปล่า การใช้งานที่แตกต่างกันของ shared_ptr ได้รับการแสดงในบทช่วยสอนนี้

ตัวอย่างที่ 1: ประกาศตัวชี้ที่ใช้ร่วมกันในรูปแบบต่างๆ

สามวิธีในการประกาศตัวชี้ที่ใช้ร่วมกันจะแสดงในตัวอย่างต่อไปนี้ มีการประกาศคลาสที่มีตัวสร้างและวิธีการสาธารณะในรหัส ตัวสร้างจะพิมพ์ข้อความเมื่อมีการสร้างวัตถุที่ใช้ร่วมกันใหม่ด้วยตัวสร้าง NS แสดง() เมธอดจะพิมพ์ข้อความตามวัตถุตัวชี้ที่ใช้ร่วมกันที่เรียก ที่นี่ อ็อบเจ็กต์พอยน์เตอร์ที่ใช้ร่วมกันตัวแรกถูกสร้างขึ้นโดยไม่ต้องเรียกคอนสตรัคเตอร์ ออบเจ็กต์ตัวชี้ที่ใช้ร่วมกันที่สองถูกสร้างขึ้นโดยการเรียกตัวสร้าง ตัวชี้ที่ใช้ร่วมกันตัวที่สามสร้างขึ้นโดยการกำหนดตัวชี้ที่ใช้ร่วมกันตัวแรก NS แสดง() มีการเรียกเมธอดสามครั้งโดยใช้อ็อบเจ็กต์พอยน์เตอร์ที่ใช้ร่วมกันสามอ็อบเจ็กต์







//รวมไลบรารีที่จำเป็น

#รวม

#รวม

ใช้เนมสเปซstd;

//กำหนดคลาส
classMyClass{
สาธารณะ:
//ประกาศตัวสร้าง
ห้องเรียนของฉัน() {
ค่าใช้จ่าย<<'ตัวสร้างถูกเรียกNS';
}
//ประกาศวิธีการพิมพ์ข้อความ
voidDisplay(สตริง str)
{
ค่าใช้จ่าย<<'วิธี Display() ถูกเรียกจาก '<<NS<<' ตัวชี้NS';
}
};

intmain()
{
//เริ่มต้น shared_ptr โดยไม่ต้องเรียก constructor
shared_ptr p1=make_shared();
p1->แสดง('แรก');
//เริ่มต้น shared_ptr โดยเรียก constructor
shared_ptr p2=shared_ptr(ใหม่MyClass);
p2->แสดง('ที่สอง');

//เริ่มต้น shared_ptr โดยการกำหนด
shared_ptr p3=p1;
p3->แสดง('ที่สาม');
ผลตอบแทน0;
}

เอาท์พุท:



ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันโค้ดด้านบน ตัวสร้างได้เรียกในขณะที่สร้างวัตถุที่สองเท่านั้น ดังนั้นข้อความของตัวสร้างจึงถูกพิมพ์เพียงครั้งเดียว:







ตัวอย่างที่ 2: พิมพ์ตำแหน่งตัวชี้ที่ใช้ร่วมกันที่จัดเก็บไว้

ตัวชี้ที่ใช้ร่วมกันของฟังก์ชัน get() ใช้เพื่อส่งคืนตำแหน่งตัวชี้ที่ใช้ร่วมกันที่เก็บไว้ ตัวอย่างต่อไปนี้จะพิมพ์ตำแหน่งของตัวชี้ที่ใช้ร่วมกันที่เก็บไว้ซึ่งสร้างขึ้นโดยคลาสและฟังก์ชัน ที่นี่ คลาสที่มีคอนสตรัคเตอร์ถูกกำหนดเพื่อใช้สำหรับการสร้างตัวชี้ที่ใช้ร่วมกัน มีการประกาศฟังก์ชันเพื่อสร้างตัวชี้ที่ใช้ร่วมกันและพิมพ์ตำแหน่งตัวชี้ที่ใช้ร่วมกันโดยใช้ฟังก์ชัน get() ในรหัสนี้ ตัวชี้ที่ใช้ร่วมกันตัวแรกถูกสร้างขึ้นโดยใช้คลาส ตัวชี้ที่แชร์ตัวที่สองถูกสร้างขึ้นโดยใช้ฟังก์ชัน และตัวชี้ที่แชร์ตัวที่สามถูกสร้างขึ้นโดยการกำหนดตัวชี้ตัวแรก

//รวมไลบรารีที่จำเป็น

#รวม

#รวม

ใช้เนมสเปซstd;

//กำหนดคลาส
classMyClass
{
สาธารณะ:
//ประกาศตัวสร้าง
ห้องเรียนของฉัน() {
ค่าใช้จ่าย<<'ตัวสร้างถูกเรียกNS';
}
};
//กำหนดฟังก์ชันเพื่อเริ่มต้นตัวชี้
voidInit_shared_ptr()
{
shared_ptr p2(ใหม่MyClass);
ค่าใช้จ่าย<<หน้า2รับ() <<'NS';
}

intmain()
{
//เริ่มต้น shared_ptr โดยเรียก constructor
shared_ptr p1=shared_ptr(ใหม่MyClass);
ค่าใช้จ่าย<<หน้า1รับ() <<'NS';

//เริ่มต้น shared_ptr โดยเรียกใช้ function
Init_shared_ptr();

//เริ่มต้น shared_ptr โดยการกำหนด
shared_ptr p3=p1;
ค่าใช้จ่าย<<หน้า 3รับ() <<'NS';
ผลตอบแทน0;
}

เอาท์พุท:



ผลลัพธ์ที่คล้ายกันต่อไปนี้จะปรากฏขึ้นหลังจากรันโค้ดด้านบน ในผลลัพธ์ ค่าที่ส่งคืนของฟังก์ชัน get() สำหรับพอยน์เตอร์ที่ใช้ร่วมกันตัวแรกและตัวที่สามจะเหมือนกัน อย่างไรก็ตาม ตัวชี้ที่ใช้ร่วมกันตัวที่สองนั้นแตกต่างกัน:

ตัวอย่างที่ 3: นับออบเจ็กต์ตัวชี้ที่ใช้ร่วมกัน

ตัวอย่างต่อไปนี้แสดงวิธีการนับจำนวนอ็อบเจ็กต์ที่ชี้โดยพอยน์เตอร์ที่ใช้ร่วมกันหลังจากสร้างและทำลายพอยน์เตอร์ มีการประกาศคลาสที่มีตัวสร้างในรหัส ตัวชี้ที่แชร์ตัวแรกถูกสร้างขึ้นโดยใช้คลาส และตัวชี้ที่แชร์ตัวที่สองถูกสร้างขึ้นโดยใช้ตัวชี้ที่แชร์ตัวแรก จำนวนอ็อบเจ็กต์ที่ชี้โดยพอยน์เตอร์ที่แชร์ทั้งก่อนและหลังการเรียกใช้ฟังก์ชัน reset() ถูกพิมพ์ในภายหลัง

//รวมไลบรารีที่จำเป็น

#รวม

#รวม

ใช้เนมสเปซstd;
//กำหนดคลาส
classMyClass{
สาธารณะ:
//ประกาศตัวสร้าง
ห้องเรียนของฉัน() {
ค่าใช้จ่าย<<'ตัวสร้างถูกเรียกNS';
}
};
intmain()
{
//เริ่มต้น shared_ptr แรกโดยเรียก constructor
shared_ptr p1(ใหม่MyClass);

//แสดงจำนวนอ็อบเจ็กต์ shared_ptr โดยตัวชี้ตัวแรก
ค่าใช้จ่าย<<'p1 ชี้ไปที่'<<หน้า1use_count() <<' วัตถุNS';
//เริ่มต้น shared_ptr ที่สองโดยใช้ shared_ptr . ตัวแรก
shared_ptr p2(p1);
//แสดงจำนวนอ็อบเจ็กต์ shared_ptr โดยตัวชี้ที่หนึ่งและตัวที่สอง
ค่าใช้จ่าย<<'p2 ชี้ไปที่'<<หน้า2use_count() <<' วัตถุNS';
ค่าใช้จ่าย<<'p1 ชี้ไปที่'<<หน้า1use_count() <<' วัตถุNS';
//ลบความเป็นเจ้าของของตัวชี้แรกออกจาก shared_ptr object
หน้า1รีเซ็ต();
//แสดงจำนวนอ็อบเจ็กต์ shared_ptr โดยตัวชี้ที่สอง
ค่าใช้จ่าย<<'p2 ชี้ไปที่'<<หน้า2use_count() <<' วัตถุNS';
ผลตอบแทน0;
}

เอาท์พุท:

ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันโค้ดด้านบน ตัวชี้แรก p1 กำลังชี้ไปที่วัตถุหนึ่งหลังการสร้าง หลังจากสร้างตัวชี้ที่สอง p2 , โดยใช้ตัวชี้แรก p1 ตัวชี้ทั้งสองจะชี้ไปที่วัตถุสองชิ้นเพื่อแชร์ตัวชี้ หลังจากเรียกใช้ฟังก์ชัน reset() สำหรับตัวชี้แล้ว p1 วัตถุหนึ่งถูกทำลาย และตัวชี้ p2 กำลังชี้ไปที่วัตถุเดียวเท่านั้น

บทสรุป:

วัตถุประสงค์ของการใช้ตัวชี้ที่ใช้ร่วมกันใน C ++ ได้รับการอธิบายในบทช่วยสอนนี้โดยใช้ตัวอย่างง่ายๆ การสร้างพอยน์เตอร์ที่แชร์ในวิธีต่างๆ การรับตำแหน่งตัวชี้ที่แชร์ที่จัดเก็บไว้ และการนับจำนวนอ็อบเจ็กต์ที่ชี้โดยพอยน์เตอร์ที่แชร์ ฉันหวังว่าผู้เขียนโค้ด C ++ จะสามารถใช้ตัวชี้ที่ใช้ร่วมกันในโค้ดได้หลังจากอ่านบทช่วยสอนนี้