Bagaimanakah Saya Boleh Melewati `std::shared_ptr` `this` dengan Selamat kepada Objek Berkaitan?

DDD
Lepaskan: 2024-10-28 21:01:30
asal
754 orang telah melayarinya

How Can I Safely Pass a `std::shared_ptr` of `this` to a Related Object?

Memahami Dilema "std::shared_ptr of this"

Dalam penggunaan penunjuk pintar, selalunya senario timbul di mana dua objek berkaitan, A dan B, memerlukan akses kepada antara satu sama lain. Walau bagaimanapun, melepasi std::shared_ptr untuk mewujudkan sambungan ini menjadi mencabar.

Sebagai contoh, pertimbangkan kelas A, induk, yang perlu menambah objek anak B. Kaedah addChild ibu bapa sepatutnya lulus std:: shared_ptr kepada anak, jadi ia boleh merujuk ibu bapa.

Walau bagaimanapun, percubaan anak langsung->setParent(ini) gagal kerana penunjuk ini adalah rnilai. Untuk menyelesaikan masalah ini, C menawarkan std::enable_shared_from_this.

Penyelesaian: std::enable_shared_from_this

std::enable_shared_from_this ialah templat kelas yang memudahkan perkongsian objek melalui std_ptr:.:share Dengan mewarisi daripadanya, anda mendapat akses kepada shared_from_this(), yang menyediakan std::shared_ptr yang diperlukan, seperti yang dilihat dalam kod yang diubah suai:

<code class="cpp">class A : public std::enable_shared_from_this<A> {
...
child->setParent(shared_from_this()); // now valid
};</code>
Salin selepas log masuk

Selain itu, untuk mengelakkan kebergantungan bulat yang boleh membawa kepada kebocoran memori , dinasihatkan menggunakan std::weak_ptr untuk kanak-kanak yang bergantung pada kewujudan ibu bapa mereka:

<code class="cpp">std::list<std::weak_ptr<B>> children; // now using weak_ptr</code>
Salin selepas log masuk

Langkah Berjaga-jaga

Perlu ambil perhatian bahawa .shared_from_this() hanya perlu dipanggil semasa panggilan objek diurus oleh std::shared_ptr. Ini bermakna ia tidak boleh dibuat pada tindanan dan biasanya tidak boleh dipanggil dalam pembina atau pemusnah.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melewati `std::shared_ptr` `this` dengan Selamat kepada Objek Berkaitan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!