Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah `std::shared_ptr` Mengekalkan Gelagat Pemusnahan Objek Walaupun Jenis Pemadaman?

Bagaimanakah `std::shared_ptr` Mengekalkan Gelagat Pemusnahan Objek Walaupun Jenis Pemadaman?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-31 17:40:01690semak imbas

How Does `std::shared_ptr` Preserve Object Destruction Behavior Despite Type Erasure?

std::shared_ptr Kefungsian Terbongkar

Siasatan berkisar pada fungsi yang membingungkan std::shared_ptr. Pada mulanya ditolak sebagai tidak munasabah, tingkah laku yang diperhatikan dalam coretan kod berikut membawa keraguan:

<code class="cpp">#include <memory>
#include <iostream>
#include <vector>

int main() {
  std::cout << "At begin of main.\ncreating std::vector<std::shared_ptr<void>>" << std::endl;
  std::vector<std::shared_ptr<void>> v;
  {
    std::cout << "Creating test" << std::endl;
    v.push_back(std::shared_ptr<test>(new test()));
    std::cout << "Leaving scope" << std::endl;
  }
  std::cout << "Leaving main" << std::endl;
  return 0;
}</code>

Kod tersebut menunjukkan output berikut:

At begin of main.
creating std::vector<std::shared_ptr<void>>
Creating test
Test created
Leaving scope
Leaving main
Test destroyed

Memahami Pemadaman Jenis

Kunci kepada tingkah laku ini terletak pada pemadaman jenis yang dilakukan oleh std::shared_ptr. Apabila memulakan kejadian baharu, std::shared_ptr menyimpan fungsi pemadam dalaman. Fungsi ini, secara lalai, memanggil pengendali padam selepas pemusnahan shared_ptr. Mekanisme ini memastikan bahawa pemusnah objek yang ditunjuk dipanggil pada masa yang sesuai, tanpa mengira jenis shared_ptr.

Akibat Casting

Membuat std ::shared_ptr kepada std::shared_ptr tidak mengubah fungsi pemadam tersimpan, yang masih merujuk kepada pemusnah ujian asal. Oleh itu, apabila share_ptr dimusnahkan, pemusnah yang betul masih dipanggil, menghasilkan tingkah laku yang diharapkan.

Pematuhan Standard dan Implikasi Masa Depan

Mengenai gelagat terjamin teknik ini, adalah penting untuk ambil perhatian bahawa pelaksanaan dalaman std::shared_ptr mungkin berbeza-beza merentas penyusun dan platform yang berbeza. Walaupun pemadaman jenis telah menjadi aspek asas shared_ptrs, perubahan masa hadapan pada pelaksanaannya mungkin berpotensi memberi kesan kepada fungsi yang diterangkan.

Oleh itu, bergantung semata-mata pada gelagat ini bukanlah amalan yang disyorkan dan harus dielakkan dalam kod pengeluaran. Sebaliknya, pendekatan alternatif, seperti menggunakan std::function atau kelas pemadam tersuai, adalah lebih teguh dan akan memberikan gelagat yang konsisten merentas pelbagai pelaksanaan.

Atas ialah kandungan terperinci Bagaimanakah `std::shared_ptr` Mengekalkan Gelagat Pemusnahan Objek Walaupun Jenis Pemadaman?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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