2016-03-12 11 views
9
void changeString(const char* &s){ 
    std::string str(s); 
    str.replace(0, 5, "Howdy"); 
    s = str.c_str(); 
} 

int main() { 
    const char *s = "Hello, world!"; 
    changeString(s); 
    std::cout << s << "\n"; 
    return 0; 
} 

Bu kodu çalıştırdığımda, "Howdy, world!" Yazdı changeString çıktığı zaman str'un imha edildiğini düşünürdüm. std::string'un yolu ile bir şey eksik miyim?dizgi ayırma: neden bu işe yarar?

+0

Ben * tahmin * bu * oldu * çalışmak için. – MikeCAT

+0

Bazen, tanımlanmamış davranışlar işe yarayabilir. Bununla birlikte, bunun işe yaramasını beklememelisiniz. –

+0

Kötü şans. Haklısın, yanlış. –

cevap

13

Evet, str yok edildi; ancak dizenin belleği temizlenmez; "s" işaretçiniz boş ama silinmemiş bir belleğe işaret eder. Çok tehlikeli. std::cout << s işaretçi erişmeye çalıştığında changeString yerel std::string yıkıcı işaretçi hala işaret bellek serbest bıraktı çünkü

13

Bu tanımsız davranış bu.

Derleyiciniz hatayı saptamak için gerekli değildir, bunun yerine istediği her şeyi yapabileceği bir ikili oluşturabilir.

İstediğiniz çıktıyı almanız gerçekti, çünkü bu sizin için kodunuzu doğru yaptı. Örneğin, kodunuzu sadece makinemde derledim ve bunun yerine boş çıktı aldım. Ayrıca düşmüş olabilir, ya da başka alakasız şeyler yapmış olabilir.