2

次のポインタがあります。

char **x = NULL;

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

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

を使用して割り当てを解除します

delete[] x;

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

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

同等?

4

4 に答える 4

7

unwind で言及されているポインター構文を除けば、それは同等です。どちらの場合も、20 char* の配列が割り当てられ、削除されます。

C++ に精通した警告:std::vector< std::string > 代わりに使用してください :) メモリ管理は必要ありません。

于 2009-07-14T07:10:19.443 に答える
4

いいえ、そのコードには構文エラーがあります。アスタリスクは型名の後に続き、その型へのポインターを形成します。っていうことは:

char*

いいえ:

*char

を使用した「C スタイル」の例ではこの権利があるmalloc()のに、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. を議論するときは C で書かれた方が自然だと感じたので、C で書かれていmalloc()ます。C++ では、戻り値をキャストする必要があります。C では、これを行うべきではありません。
于 2009-07-14T07:09:01.677 に答える
2

NewはC++で導入されました。MallocはCです。

それらを混ぜ合わせてはいけません...つまり、mallocを使用したものにdeleteを使用しないでください。この記事を確認してください。

于 2009-07-14T07:13:57.250 に答える
1

そもそもなぜそのようなものを割り当てているのか疑問に思います。C++ では、std::string の std::vector が必要になる可能性が高くなります。

于 2009-07-14T10:03:01.153 に答える