2013-06-01 13 views
7

質問が1つありました。C++ new * charは空ではありません

私はASIOでサーバーを開発しており、パケットは尖っています。

新しい文字(例:char * buffer = new char[128];)を作成するときは、手動でnullにする必要があります。

で:

for(int i =0;i<128;i++) 
{ 
buffer[i] = 0x00; 
} 

私が何か間違ったことをやって、その文字は明確ではないでしょうか?

+0

あなたの質問はすでに[[型名の後にかっこは新しいものと違いますか?](http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name -make-a-difference-with-new)。 – Troubadour

答えて

19

あなたが初期化されていない値の配列をループする必要はありません。あなたは、動的にこのようなゼロの配列をインスタンス化することができます

char * buffer = new char[128](); // all elements set to 0 
          ^^ 
3

割り当てられたメモリはクリアされません。代わりにランダムなものが含まれます。これがメモリ割り当ての仕組みです。 for -loopを実行するか、memsetを使用して手動でクリアする必要があります。それがポインタであるので、あなたがそのようにそれを行う必要があります

-5

for(int i = 0; i < 128; i++) 
{ 
(buffer + i) = 0x00; 
} 
+1

-1:コードが間違っています(0x00をrvalueに割り当てます)。アドバイスが間違っています(OPのコードはコンパイルされません)。 – milleniumbug

+0

1. LHSを間接参照するのを忘れたので、r値に割り当てようとしています(コードはコンパイルされません)。 2 'buffer [i]'は言語標準で '*(buffer + i) 'と同じです。この文脈では、配列とポインタ*は言語標準ごとに異なりますが、ある程度互換性があります。 –

11

C++におけるnew演算子の呼び出しの方法の2種類があります - 初期化とゼロが初期化デフォルト。

コール(未定義の値のままにします)初期化をデフォルトに:

int * i = new int; 

その設定がされてまで、この値を読み取るか、使用する未定義behavoirです。使用します(0に設定されます)zeroinitialiseする

int * i = new int(); 

また、これは配列で動作します:

int * i = new int[4]; // ints are not initialised, you must write to them before reading them 
int * i = new int[4](); // ints all zero initialised 

いくつかの詳細情報here

2

はあなたにもcallocを使用することができますがあります。各要素を0に自動化します。 例えば:

char* buffer = (char *) calloc (128, sizeof (char)) 

最初のパラメータが割り当てられるブロック数です。 2番目はブロックのサイズです。 この関数はvoid *を返すので、その値を(char *) に変換する必要があります。calloc(またはmallocまたは「純粋なc」割り当て関数)を使用する場合は、free関数を使用して削除の代わりにメモリを解放する方がよいでしょう。

関連する問題