次のポインタがあります。
char **x = NULL;
x はポインターの配列を指します。次のコードは正しいですか?
x = new (nothrow) (*char)[20];
を使用して割り当てを解除します
delete[] x;
は
x = (char **) malloc(sizeof(char **) * 20);
と
x = new (nothrow) (*char)[20];
同等?
次のポインタがあります。
char **x = NULL;
x はポインターの配列を指します。次のコードは正しいですか?
x = new (nothrow) (*char)[20];
を使用して割り当てを解除します
delete[] x;
は
x = (char **) malloc(sizeof(char **) * 20);
と
x = new (nothrow) (*char)[20];
同等?
unwind で言及されているポインター構文を除けば、それは同等です。どちらの場合も、20 char* の配列が割り当てられ、削除されます。
C++ に精通した警告:std::vector< std::string >
代わりに使用してください :) メモリ管理は必要ありません。
いいえ、そのコードには構文エラーがあります。アスタリスクは型名の後に続き、その型へのポインターを形成します。っていうことは:
char*
いいえ:
*char
を使用した「C スタイル」の例ではこの権利があるmalloc()
のに、C++ ではそうでないのは奇妙です。
多くのコメンターが親切にも指摘しているように、malloc()
とその使用には他にも問題がsizeof
あります。しかし、少なくとも型名は正しくなりました。個人的には、可能な限り呼び出しで型名を繰り返すことに反対しているmalloc()
ので、そのバージョンを次のように記述して、20 文字のポインターの動的配列を割り当てます。
char **x;
x = malloc(20 * sizeof *x);
こちらです:
x
「ポイントするもののサイズの 20 倍」、つまり単一のchar *
ポインターのサイズの20 倍として読み取る必要があります。wchar_t **x
。これに変更しても、偶然ではなく、引き続き機能します。malloc()
ます。C++ では、戻り値をキャストする必要があります。C では、これを行うべきではありません。NewはC++で導入されました。MallocはCです。
それらを混ぜ合わせてはいけません...つまり、mallocを使用したものにdeleteを使用しないでください。この記事を確認してください。
そもそもなぜそのようなものを割り当てているのか疑問に思います。C++ では、std::string の std::vector が必要になる可能性が高くなります。