Di salah satu program saya, saya harus berinteraksi dengan beberapa kode lama yang berfungsi const char*
.
Katakanlah saya memiliki struktur yang terlihat seperti:
struct Foo
{
const char* server;
const char* name;
};
Aplikasi tingkat tinggi saya hanya berurusan dengan std::string
, jadi saya berpikir untuk menggunakan std::string::c_str()
untuk mendapatkan const char*
petunjuk kembali .
Tapi untuk apa seumur hidup c_str()
?
Bisakah saya melakukan sesuatu seperti ini tanpa menghadapi perilaku yang tidak ditentukan?
{
std::string server = "my_server";
std::string name = "my_name";
Foo foo;
foo.server = server.c_str();
foo.name = name.c_str();
// We use foo
use_foo(foo);
// Foo is about to be destroyed, before name and server
}
Atau apakah saya harus segera menyalin hasil dari c_str()
ke tempat lain?
Terima kasih.
.c_str()
. Saya tidak mengerti mengapa kadang-kadang saya hanya mendapatkan bagian dari string, sampai saya mengerti bahwaconst char*
itu tidak hidup selamanya, tetapi sampai string itu hancurJawaban:
The
c_str()
hasil menjadi tidak valid jikastd::string
hancur atau jika fungsi anggota non-const string disebut. Jadi, biasanya Anda ingin membuat salinannya jika Anda perlu menyimpannya.Dalam kasus contoh Anda, tampaknya hasil dari
c_str()
digunakan dengan aman, karena string tidak diubah saat berada dalam cakupan itu. (Namun, kami tidak tahu apause_foo()
atau~Foo()
mungkin akan dilakukan dengan nilai-nilai itu; jika mereka menyalin string di tempat lain, maka mereka harus melakukan salinan yang sebenarnya , dan tidak hanya menyalinchar
petunjuknya.)sumber
non-const member function of the string is called.
?const
kata kunci. Fungsi seperti itu mungkin mengubah konten string, dalam hal ini string mungkin perlu mengalokasikan kembali memori untuk versi string yang dihentikan null yang dikembalikan olehc_str()
. Misalnya,size()
danlength()
areconst
, sehingga Anda dapat memanggilnya tanpa khawatir stringnya berubah, padahalclear()
sebenarnya tidakconst
.Secara teknis kode Anda baik-baik saja.
TETAPI Anda telah menulis sedemikian rupa sehingga mudah dibobol bagi seseorang yang tidak tahu kodenya. Untuk c_str () satu-satunya penggunaan yang aman adalah ketika Anda meneruskannya sebagai parameter ke suatu fungsi. Jika tidak, Anda membuka diri terhadap masalah pemeliharaan.
Contoh 1:
Jadi untuk pemeliharaan jelaskan:
Solusi yang lebih baik:
Tetapi jika Anda memiliki string const, Anda sebenarnya tidak membutuhkannya:
BAIK. Untuk beberapa alasan Anda menginginkannya sebagai string:
Mengapa tidak menggunakannya hanya dalam panggilan:
sumber
Ini valid hingga salah satu hal berikut terjadi pada
string
objek yang sesuai :Anda baik-baik saja dengan kode Anda kecuali Anda memodifikasi
string
objek tersebut setelahc_str()
s disalin kefoo
tetapi sebelumuse_foo()
dipanggil.sumber
Nilai kembali dari c_str () hanya berlaku sampai panggilan berikutnya dari fungsi anggota tidak tetap untuk string yang sama
sumber
Hasil
const char*
daric_str()
hanya valid hingga panggilan non-const berikutnya kestd::string
objek. Dalam hal ini Anda baik-baik saja karena Andastd::string
masih dalam lingkup seumur hidupFoo
dan Anda tidak melakukan operasi lain yang akan mengubah string saat menggunakan foo.sumber
Selama string tidak dihancurkan atau diubah, menggunakan c_str () tidak masalah. Jika string dimodifikasi menggunakan c_str () yang dikembalikan sebelumnya implementasi didefinisikan.
sumber
Untuk kelengkapannya, berikut referensi dan kutipan dari cppreference.com :
sumber