Onların da aynısını yaptıklarını veya .data () 'nın .c_str () çağırdığını gördüğünüzü bilseniz bile, bunun diğer derleyiciler için geçerli olacağını varsaymak doğru değildir. Derleyicinizin gelecekteki bir sürümle değişmesi de mümkündür.
Std :: string kullanmak için 2 neden:
std :: string hem metin hem de rastgele ikili veriler için kullanılabilir.
//Example 1
//Plain text:
std::string s1;
s1 = "abc";
//Example 2
//Arbitrary binary data:
std::string s2;
s2.append("a\0b\0b\0", 6);
Örnek 1 olarak dizenizi kullanırken .c_str () yöntemini kullanmalısınız.
Örnek 2 olarak dizenizi kullanırken .data () yöntemini kullanmalısınız. Bu durumlarda .c_str () kullanmak tehlikeli olduğundan değil, başkalarının gözden geçirmesi için ikili verilerle çalışmanız daha açık olduğu için senin kodun.
.Data () kullanımıyla ilgili olası tuzaklar
Aşağıdaki kod yanlıştır ve programınızda bir segfault'a neden olabilir:
std::string s;
s = "abc";
char sz[512];
strcpy(sz, s.data());//This could crash depending on the implementation of .data()
Uygulayıcıların .data () ve .c_str () 'yi aynı şeyi yapması neden yaygındır?
Çünkü bunu yapmak daha verimli. .Data () 'nın boş sonlandırılmamış bir şeyi döndürmesini sağlamanın tek yolu, .c_str () veya .data ()' nın dahili tamponlarını kopyalamasına sahip olmak veya sadece 2 tampon kullanmaktır. Tek bir boş sonlandırılmış arabelleğe sahip olmak, her zaman std :: string uygularken yalnızca bir dahili arabellek kullanabileceğiniz anlamına gelir.
.data()
, bu nedenle artık sabit olmayan dizeler için eşdeğer değildirler.