Pertanyaan Apakah representasi C ++ 11's std :: string yang mendasari dijamin memiliki karakter null terminating pada tempatnya? [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Beberapa kutipan dari standar pertama:

Spesifikasi untuk string::operator[]():

const_reference operator [] (size_type pos) const;
  operator referensi [] (size_type pos);
Membutuhkan: pos <= ukuran ().
Pengembalian: * (mulai () + pos) jika pos <size (), jika tidak referensi ke suatu   objek tipe T dengan nilai charT (); nilai yang direferensikan tidak boleh   diubah.
Kompleksitas: waktu yang konstan.

Spesifikasi untuk string::c_str() dan string::data():

const charT * c_str () const noexcept;
  const charT * data () const noexcept;
Pengembalian: A pointer p seperti itu p + i == &operator[](i) untuk setiap saya   [0, ukuran ()].
Kompleksitas: waktu yang konstan.

Dengan menggabungkan 2 spesifikasi ini, kita dapat melihat bahwa pointer p dikembalikan oleh c_str()/data() harus memuaskan itu p[0...size()-1] menunjuk elemen dari string, dan p[size()] sama dengan operator[](size()), yang menunjuk objek dengan nilai charT(). Karena operator aditif pada pointer digunakan untuk mendapatkan alamat dari elemen string dan yang terakhir charT() objek, mereka harus dalam satu larik (Anda tidak dapat memiliki hanya elemen string di tempat dan membuat charT() objek on-the-fly dan mengembalikannya). Jadi apakah aman untuk mengatakan bahwa dalam C ++ 11, str::string dijamin memiliki karakter null terminating di tempat penyimpanan yang mendasarinya?


EDIT: Permintaan maaf saya karena gagal untuk melihat pertanyaan saya adalah duplikat. Namun, jawaban yang saya dapatkan di sini tampaknya bertentangan dengan jawaban dalam pertanyaan duplikat itu.

Juga, saya seharusnya melemahkan asumsi saya seperti ini: Representasi yang mendasarinya std::string harus mencadangkan ruang yang cukup untuk menahan karakter null terminating, dan mengambil kebebasannya untuk mengatur charT() nilai hingga c_str()/data() dipanggil. (yaitu. Penyimpanan yang mendasari harus dapat menyimpan setidaknya size()+1 elemen kapan saja.)


5
2018-03-11 14:17


asal


Jawaban:


Tidak, bukan itu. std::string dapat malas-menghitung hasil yang diperlukan untuk c_str() dan data(). Tidak ada jaminan bahwa terminator null ada di penyimpanan yang mendasarinya sampai metode tersebut dipanggil.

Standar hanya menjamin kedekatan karakter string.


2
2018-03-11 14:24



Jadi apakah aman untuk mengatakan bahwa dalam C ++ 11, std::string dijamin memiliki karakter null terminating di tempat penyimpanan yang mendasarinya?

Saya tidak melihat bagaimana Anda dapat mencapai kesimpulan ini dari dua kutipan. Secara khusus, saya tidak melihat apa pun dalam tanda kutip yang akan membutuhkan implementasi yang mendasari untuk mempertahankan karakter null terminating sampai Anda menelepon c_str() atau data().


1
2018-03-11 14:23



Tidak ... Aman untuk mengatakan apa yang dikatakannya: Itu operator[](size()) == CharT() dan itu c_str()[size()] == 0 dan itu data()[size()] == 0.

Apakah "penyimpanan yang mendasarinya" memiliki nilai 0 di dalam ada implementasi yang ditentukan, dan juga seharusnya tidak berpengaruh pada program Anda karena tidak ada cara untuk mengaksesnya kecuali melalui hal-hal seperti operator[] dan c_str(), yang didefinisikan dengan baik di size().


1
2018-03-11 14:27