Perangkap dan Jangka Hayat
Elakkan view tergantung
Perangkap dan Jangka Hayat ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Paparan Tidak Memiliki Data
Sesuatu string_view hanya menunjuk kepada aksara yang dimiliki di tempat lain. Jika storan itu hilang, paparan menjadi tergantung; mengaksesnya menghasilkan tingkah laku yang tidak ditakrifkan.
Tergantung pada Objek Sementara
Mengikat paparan kepada std::string sementara adalah berbahaya: objek sementara itu musnah pada penghujung pernyataan, menyebabkan paparan menunjuk kepada memori yang telah dibebaskan.
#include <string>
#include <string_view>
std::string make() { return "temp"; }
int main() {
std::string_view sv = make(); // dangles immediately
// using sv here is undefined behavior
(void)sv;
}Memulangkan Paparan kepada Pemboleh Ubah Setempat
Jangan sekali-kali memulangkan paparan yang menunjuk ke dalam rentetan setempat; rentetan setempat itu dimusnahkan apabila fungsi memulangkan kawalan.
#include <string>
#include <string_view>
std::string_view bad() {
std::string local = "oops";
return local; // local dies, view dangles
}
int main() { (void)bad(); }Selamat: Paparan bagi Rentetan yang Masih Hidup
Paparan adalah selamat selagi sumbernya mempunyai jangka hayat yang lebih panjang daripadanya. Dalam contoh ini, rentetan itu hidup sepanjang fungsi.
#include <iostream>
#include <string>
#include <string_view>
int main() {
std::string s = "alive";
std::string_view sv = s;
std::cout << sv << "\n"; // safe
}Tidak Diakhiri dengan Aksara Nul
Data paparan tidak dijamin berakhir dengan \0. Menghantar sv.data() kepada fungsi C yang menjangkakan rentetan C boleh menyebabkan bacaan melepasi hujung.
Gunakan size(), Bukan strlen
Sentiasa gunakan sv.size() untuk mendapatkan panjang dan bukannya fungsi rentetan C, kerana sesuatu paparan mungkin merupakan hirisan daripada penimbal yang lebih besar.
#include <iostream>
#include <string_view>
int main() {
std::string_view sv = std::string_view("hello world").substr(0, 5);
std::cout << sv.size() << "\n"; // 5, not 11
}Mengubah Sumber
Jika rentetan asas diperuntukkan semula, contohnya apabila push_back membesarkan kapasitinya, paparan sedia ada ke dalam rentetan itu menjadi tidak sah.
Menyimpan Paparan dalam Ahli Kelas
Berhati-hati apabila menyimpan string_view sebagai ahli kelas; anda mesti menjamin bahawa data yang dirujuk mempunyai jangka hayat yang lebih panjang daripada objek itu. Jika ragu-ragu, simpan std::string sebagai gantinya.
Parameter Biasanya Selamat
Menggunakan string_view sebagai parameter fungsi ialah kes yang selamat dan mengikut amalan biasa: argumen mempunyai jangka hayat yang lebih panjang daripada panggilan.
#include <iostream>
#include <string_view>
size_t len(std::string_view sv) { return sv.size(); }
int main() {
std::cout << len("temporary is fine here") << "\n";
}Salin Apabila Perlu Mengekalkan
Jika anda perlu menyimpan teks selepas jangka hayat sumbernya berakhir, salinkannya ke dalam std::string. Penyalinan itu ialah kos untuk memiliki data.
#include <string>
#include <string_view>
std::string keep(std::string_view sv) {
return std::string(sv); // owns a copy
}
int main() { (void)keep("persist"); }Panduan Umum
Utamakan string_view untuk parameter dan pemboleh ubah setempat yang berjangka pendek. Elakkannya sebagai jenis pulangan atau ahli yang berjangka panjang melainkan data itu jelas mempunyai jangka hayat yang lebih panjang.
Semakan Ringkas
Semak pemahaman anda tentang jangka hayat paparan.
Ringkasan
Anda telah mempelajari perangkap dan jangka hayat paparan:
- Paparan tidak memiliki data; sumbernya mesti mempunyai jangka hayat yang lebih panjang daripada paparan.
- Elakkan paparan kepada objek sementara dan pemboleh ubah setempat.
- Paparan tidak dijamin berakhir dengan aksara nul; gunakan
size(). - Salin ke dalam
std::stringapabila anda perlu mengekalkan teks.
Pelajari C++ dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “Perangkap dan Jangka Hayat” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Perangkap dan Jangka Hayat”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Perangkap dan Jangka Hayat”?
Elakkan view tergantung Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Perangkap dan Jangka Hayat” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mengapa string_view
- Mencipta View
- Perangkap dan Jangka Hayat
- Algoritma Rentetan