2014-08-28 57 views
0

說我在一類C++指針使用它之前deferenced

const char* info; 


bool machine::ping(){ 
    if(info[0] == '\0'){ 
     printf("%s", "null"); 
    } 
    else{ 
     printf("%s",info); <---------- This does NOT print out what I expect. :(
    } 
} 

bool machine::RecvNotify(const Data& aData){ 
    info = aData.path(); 
    printf("%s",info); <------- This works well and prints out what I expect 
} 

我想我不能定義這個變量這樣定義的變量。請讓我知道是否有什麼我應該改變。謝謝

+1

'info'指向任何'aData'指向的存儲區。可能錯誤是因爲在調用'machine :: ping()'之前,該對象被銷燬了。相反,你應該使用'std :: string info;' – 2014-08-28 06:16:50

+0

同意,你會介意爲什麼sdt :: string info可以在調用ping()函數之前避免被殺死? – Sam 2014-08-28 06:23:31

+1

'std :: string'存儲一個字符串;如果它是'machine'類的成員,那麼只要包含它的對象存在,它仍然存在。 'char const * info'不存儲字符串;它指向程序的其他部分存儲字符串的位置。 – 2014-08-28 06:24:30

回答

1

該變量是好的,但aData.path可能只返回一個臨時字符串,具體取決於實現。

如果將const char* info更改爲std::string,會發生什麼情況?

+0

同意,我確定它是一個臨時字符串,我想將它保存爲永久字符串。這是我的意圖。 – Sam 2014-08-28 06:15:45

0

有兩件事。

首先,「machine :: RecvNotify()」應該在「machine :: ping()」之前調用。這是給「信息」一個地址指向。其次,在「machine :: RecvNotify()」中,當您調用「machine :: ping()」時,是仍然在範圍中的「aData」。如果沒有,當您調用「machine :: ping()」時,「info」將會有無效的地址指向。這可能會導致您的「意外輸出」。

如果您希望能夠具有「aData.path()」的值,即使它不在作用域中,也可以複製它的值。如上所述,您可以將值複製到std :: string成員變量中。