2012-02-23 72 views
2

我有我的Arduino的代碼,構造函數是類似以下內容:我是否需要爲構造函數的char指針分配內存?

class X { 
    private: 
    char* _name; 
    public: 
    X(char*); 
} 

X::X(char* name) { 
    _name = name; 
} 

我的問題是:我需要分配一個字符緩衝區,而不是僅僅依靠這是傳遞的字符串的指針?我沒有在字符串上操作(除了縮短它)。我似乎沒有遇到任何問題,但我想驗證。

這是針對arduino的,但對C和C++的迴應也會受到歡迎。

回答

3

這取決於。

基本上,現在代碼的方式,你要求這個名字的生命期大於類實例的生命期。如果name始終是一個字符串,即X(「foo」),那麼這是可以接受的。否則,調用者將不得不分配字符串,這是一個奇怪而且容易出錯的合約要求。

我會建議在構造函數中總是重複字符串,除非明確指出它始終是字符串文字。

3

你不需要分配緩衝區,但它可能更健壯。特別是因爲你在嵌入式系統上,就像沒有調試器一樣,所以如果有人向你傳遞一個來自調用者堆棧的字符串,你就會崩潰。試圖弄清楚這種問題在哪裏就像乾草堆裏的針。簡而言之,如果有人向你傳遞了一些數據,很難保證記憶會持續下去,所以你最好自己照顧好自己的分配。

3

在這種情況下,您可能會遇到問題。

X foo() { 

     char ar[10]; 
     strcpy(ar,"Hello"); 

     X obj(ar); 

     return obj; 
} // ar is deallocated here. 

但返回的對象的成員變量_name仍然指向ar較早在堆棧上了。所以,最好分配內存,然後在不再需要時釋放內存。

相關問題