0

このコードがあるとしましょう。

int* Func(std::vector<int> integers)
{
   for (int i : integers)
   {
       if (something) 
       {
           return &i;
       }
   }

   return nullptr;
}

int* x = Func({3, 4, 5, 6, 7});
delete(x); ???

「x」(nullptr でない場合) を削除する必要がありますか? 私の知る限り、演算子「new」で割り当てられたメモリのみを解放する必要があります。これは確かにここでは当てはまりません。

4

2 に答える 2

2

簡単な回答: すべきではないというあなたの意見は正しいですがdelete、それはあなたの心配事ではありません…</p>

ローカル変数 ( i) のアドレスを返しています。それは悪いカルマです。

これを次のように修正することができます (2 つの余分な&s に注意してください)。

int * Func(std::vector<int> & integers) {
    for (int & i : integers)
        if (something)
            return &i;
    return nullptr;
}

しかし、それでも問題があります。渡すベクトルは{3, 4, …}、セミコロンを通過する前に破棄される一時的な ( ) であるためです。実際、一時変数を左辺値参照として渡そうとしているので、コンパイルすらできないと思います。

あなたは C++11 を使用しているので、あなたが達成しようとしていることは次のとおりです。

std::vector<int> integers = {3, 4, 5, 6, 7};
auto x = std::find_if(begin(integers), end(integers), [](int i) { return something; });
if (x != end(integers)) {
    // Use *x…
} else {
    // Not found
}
于 2013-08-11T11:19:47.327 に答える
1

deleteedされていないので d であってはならないことは正しいですがnew、コード スニペットの最大の問題は、ローカル変数へのポインターを返すことですi。これは、返されたポインターに定義された意味がないことを意味します。

于 2013-08-11T11:19:38.640 に答える