3

これは私には少し不明確です...だから、もし私が関数を持っているなら:

char *test(int ran){
    char *ret = new char[ran];
    // process...
    return ret;
}

そしてそれを複数回呼び出します:

for(int i = 0; i < 100000000; i++){
   char *str = test(rand()%10000000+10000000);
   // process...

   // delete[] str; // do i have to delete it here?
}

問題は、呼び出しdelete[]ごとに使用する必要があるかどうかです。new[]

4

3 に答える 3

5

その必要はありませ。ただし、'new' で予約したメモリを削除しないと、最終的にメモリが不足し始めます (メモリ リーク)。

于 2010-06-03T12:44:02.250 に答える
5

そうしないと、メモリ リークが発生します。

ただし、ある関数で割り当てて別の関数で解放するのは、最善のアイデアではありません。for ループで割り当ててポインタを渡してはどうでしょうか。これにより、コード内でandが一緒にtest保持されます。newdelete

于 2010-06-03T12:37:50.920 に答える
3

答えはすでに与えられていますが、質問にCではなくC++としてタグ付けしたので、これはおそらくC++でやりたい方法です(もちろん、そうしない理由は他にもあるかもしれませんが、可能性はほとんどありません)。

vector<char> (int ran){
    vector<char> ret(char);
    // process...
    return ret;
}

そしてそれを呼び出すには:

for(int i = 0; i < 100000000; i++){
   vector<char> str = test(rand()%10000000+10000000);
   // process...
}

新しいものがないため、削除されないため、メモリリークはありません。

実際には、おそらく char* の代わりに std::string を使用したいでしょう (より一般的な例を示すために vector を使用しました)。

コピーされるデータについて心配する必要はありません。コンパイラはそれを最適化します。 編集:わかりました、最適化されない可能性があります:)しかし、そうなる可能性は非常に高いです。パフォーマンスの問題がない限り、最も単純なバージョンを使用してください。

于 2010-06-03T12:52:46.550 に答える