C++ Academy · Pelajaran

Perangkap dan Jangka Hayat

Elakkan view tergantung

Pelajaran 3 daripada 413 langkah

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::string apabila anda perlu mengekalkan teks.
Percuma untuk bermula

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

  1. Mengapa string_view
  2. Mencipta View
  3. Perangkap dan Jangka Hayat
  4. Algoritma Rentetan
← Kembali ke C++ Academy