Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menggunakan Semula Bekas Beralih dengan Selamat dalam 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!