Rumah >pembangunan bahagian belakang >C++ >Mengapa Saya Tidak Boleh `menolak_kembali` Penunjuk Unik ke dalam Vektor, dan Bagaimana Saya Membetulkannya?

Mengapa Saya Tidak Boleh `menolak_kembali` Penunjuk Unik ke dalam Vektor, dan Bagaimana Saya Membetulkannya?

Susan Sarandon
Susan Sarandonasal
2024-12-22 14:12:10189semak imbas

Why Can't I `push_back` Unique Pointers into a Vector, and How Do I Fix It?

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!

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