Vektor Penunjuk Unik: Mengapa push_back Ditolak dan Cara Mengatasinya
Dalam C , kita menghadapi halangan apabila cuba menyimpan unik penunjuk dalam vektor. Bekas vektor mengharapkan elemen yang membenarkan penyalinan, manakala penunjuk unik mematuhi prinsip pemilikan unik.
Pertimbangkan coretan berikut:
std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(ptr2x); // Compiler error: attempt to copy unique pointer
Ralat berpunca daripada reka bentuk unique_ptr untuk memastikan eksklusif pemilikan. Menyalin unique_ptr akan melanggar sifat asas ini, menjejaskan tujuan terasnya.
Bergerak untuk Menyelesaikan Dilema
Untuk menyelesaikan isu ini, kita mesti menggunakan operasi "gerakan" bukannya meniru. Operasi pemindahan memindahkan pemilikan dari satu bekas ke bekas yang lain, memastikan tiada pertindihan.
vec.push_back(std::move(ptr2x));
Dengan pengubahsuaian ini, kod tersebut berjaya memasukkan unique_ptr ke dalam vektor, mengekalkan pemilikan eksklusifnya.
Nota Awas
Adalah penting untuk ambil perhatian bahawa menggunakan_ptr unik untuk menguruskan penunjuk kepada pembolehubah tempatan seperti 'x' tidak disyorkan. Pembolehubah setempat dikendalikan secara automatik semasa keluar blok (cth., fungsi kembali dalam kes ini). Sebaliknya, anda harus memperuntukkan objek secara dinamik.
std::unique_ptr<int> ptr(new int(1));
Dalam C 14, kita boleh memudahkan lagi perkara ini menggunakan make_unique:
std::make_unique<int>(5);
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh `menolak_kembali` Penunjuk Unik ke dalam Vektor, dan Bagaimana Saya Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!