25

C では を使用malloc(), free()しましたが、C++ では を使用してnew, deleteいますが、C には もありrealloc、新しいブロックを割り当てて古いデータをコピーし (共通の最小値)、古いデータ ブロックを解放します。では、その C++ バージョンは何ですか? もちろん自分で書くこともできますが、組み込みのものはありますか?

main() {
  int i; char *x = malloc(3);
  x[0] = 10;
  x[1] = 20;
  x[2] = 30;
  realloc(x, 4);
  x[3] = 40;
  for (i = 0; i < 4; i++) printf("%i\n", x[i]);
}
4

4 に答える 4

39

C++にはnew/deleteに相当するものはありません。realloc

Bjarne Stroustrup の FAQから:

C++ に realloc() に相当するものがないのはなぜですか?

必要に応じて、もちろん realloc() を使用できます。ただし、realloc() は、ユーザー定義のコピー コンストラクターを持たないオブジェクトを含む malloc() (および同様の関数) によって割り当てられた配列でのみ機能することが保証されています。また、単純な予想に反して、realloc() は時折その引数配列をコピーすることを覚えておいてください。C++ では、再割り当てを処理するより良い方法は、ベクターなどの標準ライブラリ コンテナーを使用し、それを自然に大きくすることです。

サイズ変更可能なコンテナが必要な場合は、 を使用しますstd::vector。それ以外の場合はmallocreallocとを使用しfreeます。

そして、最後の質問に答えるために、コードの C++ バージョンは次のようになります。

main() {
    std::vector<char> x(3);
    x[0] = 10;
    x[1] = 20;
    x[2] = 30;
    x.resize(4);
    x[3] = 40;
    for (int i = 0; i < 4; i++) std::cout << x[i] << std::endl;
}
于 2013-05-23T13:17:34.240 に答える
24

Bjarne Stroustrup の考えを見てみましょう!

C++ に realloc() に相当するものがないのはなぜですか?

必要に応じて、もちろん realloc() を使用できます。ただし、realloc() は、ユーザー定義のコピー コンストラクターを持たないオブジェクトを含む malloc() (および同様の関数) によって割り当てられた配列でのみ機能することが保証されています。また、単純な予想に反して、realloc() は時折その引数配列をコピーすることを覚えておいてください。

C++ では、再割り当てを処理するより良い方法は、ベクターなどの標準ライブラリ コンテナーを使用し、それを自然に大きくすることです。

于 2013-05-23T13:21:42.750 に答える
3

reallocは、C++ では使用されません。これは、C++ がそのコピーおよびデフォルトのコンストラクターとデストラクタを一般的にこのようなものに使用したいためです。しかし、できるだけ早く処理したい単純な古い型を取得した場合、必要な処理を実行する独自の配列クラスを展開しない理由はありません。Google のトップページに STL とほとんど互換性のあるものがないことに驚いています。

于 2014-09-15T05:29:12.600 に答える
3

new/deleteC++ にはC に相当するものはありませんrealloc

考えられる理由 (標準のどこにも言及されていませんが) は、コンストラクターがスローできるためです。再割り当て中にコンストラクターがスローした場合、どのように動作する必要がありますか? 真の答えは 1 つではありません。

于 2013-05-23T13:18:55.343 に答える