2009-07-14 9 views
2

私は以下のポインタを持っています。新しい演算子を正しく使用していますか?

char **x = NULL; 

xは、ポインタの配列を指します。次のコードは正しいですか?

x = new (nothrow) (*char)[20]; 

と我々は

delete[] x; 

を使用してそれをdealocateます同等

x = (char **) malloc(sizeof(char **) * 20); 

x = new (nothrow) (*char)[20]; 

ですか?

答えて

4

いいえ、そのコードには構文エラーがあります。アスタリスクはの後にの型名になり、その型へのポインタを形成します。だから、それはです:

char* 

ない:

*char 

それはあなたがmalloc()を使用して、 "C-スタイル" の例では、この権利を持っていることを奇妙だ、ではなくC++で。

多くのコメント投稿者が十分に指摘しているように、malloc()には他にも問題がありますが、sizeofを使用しています。しかし、少なくともそれは型名が正しいことになります。個人的に私はすべての可能であればmalloc()呼び出しでタイプ名を繰り返すことに反対ですので、私は20の文字ポインタの動的配列を割り当てるために、次のようにそのバージョンを記述します。

char **x; 

x = malloc(20 * sizeof *x); 

この方法:

  1. xが指すサイズの20倍」つまり、単一のchar *ポインターのサイズの20倍と読んでください。
  2. 魔法の定数20が1か所にのみ含まれています。
  3. wchar_t **xに変更する場合は、タイプの一部を繰り返しませんが、これは偶然ではなく動作します。
  4. malloc()について議論すると、より自然であると感じていたので、Cで書かれています。 C++では、戻り値をキャストする必要があります。 Cでは、決してそれを行うべきではありません。
+2

あなたは私よりも優れたパーサーです! – xtofl

+1

彼は20文字* 20のchar * sの配列を作成しているので、彼は完全に正しく使用しませんが。 2つのサイズが違うというわけではありません。 – Goz

+0

@unwind私の悪い。私は単に(* char)の代わりに(char *)を書いたことを見落としました。
@Goz私は何を言いたいのか分からなかった。ここでx [i]は(char *)のポニターを指し示します。それぞれの長さはさまざまです。私の宣言が正しいことを願っています。 – AppleGrew

7

unwindで言及されているポインタ構文とは別に、それは等価です.20 char *の配列は、どちらの場合でも割り当てられ、削除されます。

C++ - adept警告:代わりにstd::vector< std::string >を使用します。メモリ管理は不要です。

2

新機能はC++で導入されました。 MallocはCです。

あなたはミックスしてマッチしてはいけません。つまり、mallocを使ったものでは削除しないでください。 thisの記事をチェックしてください。

1

なぜ私はあなたが最初にそのようなことを割り当てているのだろうと思う。 C++では、std :: stringのstd :: vectorが必要とする可能性が非常に高いです。