2010-08-11 81 views
9

下面的代碼需要打印「kevin」 但是,它正在打印垃圾值。我檢查了調試器。由「operator char *」調用返回的指針無效。任何想法?「運算符char *」問題

class Wrapper 
{ 
private: 
    char* _data; 

public: 

    Wrapper(const char* input) 
    { 
     int length = strlen(input) + 1; 
     _data = new char[length]; 
     strcpy_s(_data, length, input); 
    } 

    ~Wrapper() 
    { 
     delete[] _data; 
    } 

    operator char*() 
    { 
     return _data; 
    } 
}; 

int main() 
{ 
    char* username = Wrapper("kevin"); 
    printf(username); 
    return 0; 
} 
+6

我的第一個建議是隻使用std :: string,因爲你顯然使用C++。 – 2010-08-11 19:13:38

+0

你爲什麼編輯出我添加的指針標籤? – James 2010-08-11 19:14:09

+0

請記住,您通常應避免隱式轉換。 (當然,使用'std :: vector'或者'std :: string'等) – GManNickG 2010-08-11 19:34:43

回答

15

的問題是,你的Wrapper對象正在建造之中,暫時並立即銷燬。通過operator char*,您將返回一個指向內存的指針,該內存在被銷燬時已被Wrapper對象刪除。

要使其工作:

Wrapper wrapper("Kevin"); 
char* username = wrapper; 
+1

謝謝。這非常快。 – 2010-08-11 19:17:54

+2

@ sankaran1984幫助他/她接受答案,它是左邊的大號複選標記。 = P – James 2010-08-11 19:20:22

+1

對於回覆者來說,這可能是一件好事,也可以從SO新手那裏得到一個良好表達的問題。 – 2010-08-11 19:25:13

4

這條線:

char* username = Wrapper("kevin"); 

創建它立即銷燬,留下您的指針指向無所一種無名的包裝對象。你需要給包裝對象一個名字,或者不要寫這樣的代碼。這會工作:

Wrapper w("kevin"); 
char* username = w; 
printf("%s", username); 
4

要返回正在被包裝的析構函數,只要它超出範圍的第一個語句的結束時刪除指針 - 中的printf之前。
在某些情況下,可能會掩蓋此錯誤,因爲可能無法立即回收內存,並且即使該內存不再有效,該值也會顯示爲「正常」。有些工具可以幫助檢測這一點。

1

此語句創建一個臨時Wrapper對象:

char* username = Wrapper("kevin"); 

在聲明的最後,(「充分體現」)的Wrapper對象被銷燬。你留下了一個懸掛指針(即它指向的內容已被刪除)。

返回一個指向對象內部數據的指針(或引用)通常是危險的,在合理時應該避免。在任何情況下,你不覺得世界上有足夠的字符串類嗎?你真的需要寫另一個嗎?