Rumah >pembangunan bahagian belakang >C++ >Bolehkah std::shared_ptr digunakan untuk pembersihan yang boleh dipercayai semasa penutupan?

Bolehkah std::shared_ptr digunakan untuk pembersihan yang boleh dipercayai semasa penutupan?

DDD
DDDasal
2024-11-03 08:03:30401semak imbas

Can std::shared_ptr be used for reliable cleanup at shutdown?

std::shared_ptr: Fungsi Tidak Dijangka

std::shared_ptr, yang diperkenalkan dalam C 11, disediakan satu cara untuk mengurus objek yang diperuntukkan secara dinamik dengan pemilikan bersama. Walau bagaimanapun, kes penggunaan yang menarik muncul menggunakan std::shared_ptr, di mana ia digunakan untuk pembersihan sewenang-wenangnya semasa penutupan. Walaupun nampaknya berlawanan dengan intuisi, teknik ini menimbulkan persoalan asas tentang kelakuan dan kebolehpercayaan std::shared_ptr.

Contoh Berfungsi

Pertimbangkan coretan kod berikut:

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

class Test {
public:
  Test() { std::cout << "Test created" << std::endl; }
  ~Test() { std::cout << "Test destroyed" << std::endl; }
};

int main() {
  std::vector<std::shared_ptr<void>> v;
  {
    v.push_back(std::shared_ptr<Test>(new Test()));
  }
  return 0;
}</code>

Anehnya, kod ini mengeluarkan:

Test created
Test destroyed

Ini menunjukkan bahawa objek Ujian dimusnahkan dengan betul walaupun ia dipegang oleh std::shared_ptr.

Mekanisme Dasar

std::shared_ptr menyediakan pemadaman jenis, memisahkan jenis objek terurus daripada pelaksanaan. Secara dalaman, ia menyimpan fungsi pemadam yang memanggil pemusnah yang sesuai berdasarkan jenis objek asal.

Apabila std::shared_ptr disalin ke std::shared_ptr, fungsi pemadam kekal utuh. Pemadam yang disimpan bertanggungjawab untuk memanggil pemusnah Ujian dalam contoh kami.

Pematuhan dan Kebolehpercayaan Standard

Walaupun tingkah laku yang diterangkan pada masa ini berfungsi, ia bergantung pada butiran pelaksanaan dan tidak dijamin oleh piawaian C. Ini disebabkan oleh dua sebab:

  • Jenis pemadaman: Penyahgandingan jenis dalaman shared_ptr boleh membawa kepada tingkah laku yang tidak dijangka jika pelaksanaan berubah pada masa hadapan.
  • Fungsi pemadam: Pelaksanaan std::shared_ptr tidak diwajibkan untuk melaksanakan fungsi pemadam untuk void*.

Oleh itu, penggunaan std::shared_ptr untuk pembersihan sewenang-wenangnya mungkin merupakan amalan berisiko dan tidak disyorkan untuk kod yang boleh dipercayai.

Atas ialah kandungan terperinci Bolehkah std::shared_ptr digunakan untuk pembersihan yang boleh dipercayai semasa penutupan?. 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