2012-02-23 9 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

バッファを割り当てる必要はありませんが、おそらくより堅牢です。特に、組み込みシステムの場合、デバッガなしでlikeyなので、誰かが呼び出し元のスタックから文字列を渡すと、ホースされます。そのような問題がどこにあるのか把握しようとするのは、乾草の針のようなものです。要するに、誰かがあなたにデータを渡した場合、メモリが持続することを保証することは非常に難しいので、自分で割り当てを処理する方が良いです。

3

この場合、問題が発生する可能性があります。

X foo() { 

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

     X obj(ar); 

     return obj; 
} // ar is deallocated here. 

しかし、まだ以前のスタック上だったarを指しているオブジェクトのメンバ変数_nameを返されました。したがって、メモリを割り当てて、不要になったときにメモリを解放する方がよいでしょう。

関連する問題