Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menggunakan Semula Bekas Beralih dengan Selamat dalam C ?

Bagaimanakah Saya Boleh Menggunakan Semula Bekas Beralih dengan Selamat dalam C ?

Barbara Streisand
Barbara Streisandasal
2024-12-02 16:43:10200semak imbas

How Can I Safely Reuse a Moved Container in C  ?

Mengalih Pemilikan dan Menggunakan Semula Bekas dalam C

Dalam C , apabila objek dialihkan (menggunakan fungsi std::move), ia pemilikan dipindahkan kepada pembolehubah baharu. Ini bermakna pembolehubah asal menjadi kosong dan tidak mengandungi data yang sah.

Satu soalan biasa yang timbul apabila bekerja dengan bekas yang dialihkan ialah cara menggunakannya semula. Timbul persoalan: "Apakah cara yang betul untuk menggunakan semula bekas yang dialihkan?"

Memahami "Keadaan Sah tetapi Tidak Ditentukan"

Mengikut draf standard C 0x , objek demi pergerakan berada dalam "keadaan sah tetapi tidak ditentukan." Ini bermakna objek itu memenuhi invariannya, tetapi keadaan dalamannya tidak dijamin konsisten.

Pilihan 1: Tiada Buat Apa

Satu pilihan ialah tidak melakukan apa-apa dan andaikan objek itu masih sah. Walau bagaimanapun, pendekatan ini tidak disyorkan kerana ia boleh membawa kepada tingkah laku yang tidak ditentukan jika keadaan dalaman bekas tidak konsisten.

Pilihan 2: "Tetapkan Semula" dengan jelas

Satu lagi pilihan ialah menggunakan kaedah yang jelas untuk "menetapkan semula" bekas dan menjadikannya kosong. Pendekatan ini memastikan keadaan dalaman bekas adalah konsisten dan membolehkan ia digunakan semula dengan selamat.

Pilihan 3: Mulakan Semula dengan Pembina Lalai

Pilihan terakhir adalah dengan hanya memulakan semula bekas menggunakan pembina lalainya. Pendekatan ini juga memastikan keadaan dalaman bekas adalah konsisten dan boleh digunakan semula.

Pendekatan Pilihan

Pendekatan pilihan untuk menggunakan semula bekas yang dialihkan ialah menggunakan kaedah yang jelas . Pendekatan ini selamat dan cekap, dan ia mengelakkan kemungkinan perangkap yang dikaitkan dengan pilihan lain.

Contoh

Pertimbangkan kod berikut:

std::vector<int> container;
container.push_back(1);
auto container2 = std::move(container);

//container2.clear(); Reset
container = std::vector<int>(); // Reinitialize

container.push_back(2);
assert(container.size() == 1 && container.front() == 2);

Dengan menggunakan kaedah yang jelas untuk menetapkan semula bekas2, kami memastikan keadaan dalamannya konsisten dan boleh digunakan semula dengan selamat. Akibatnya, operasi push_back seterusnya menambah elemen baharu pada bekas dengan betul.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Semula Bekas Beralih dengan Selamat dalam C ?. 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