Допустим, у меня есть этот код.
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); ???
Должен ли я удалить «х» (если это не nullptr)? Насколько я знаю, мы должны освобождать только память, выделенную оператором ‘new’. Это, конечно, не тот случай, здесь.
Краткий ответ: вы правы, что не должны delete
, но это меньше всего твоих забот …
Вы возвращаете адрес локальной переменной (i
). Это плохая карма.
Вы можете попытаться исправить это следующим образом (обратите внимание на два дополнительных &
s):
int * Func(std::vector<int> & integers) {
for (int & i : integers)
if (something)
return &i;
return nullptr;
}
Но даже тогда у вас есть проблема, так как передаваемый вектор является временным ({3, 4, …}
) который уничтожается до того, как вы пройдете точку с запятой. На самом деле, я не думаю, что он даже скомпилируется, так как мы сейчас пытаемся передать временную ссылку как l-значение.
Поскольку вы используете 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
}
Вы правы в том, что этого не должно быть delete
д, так как это не было new
но самая большая проблема в вашем фрагменте кода в том, что вы возвращаете указатель на локальную переменную i
, Это будет означать, что возвращаемый указатель не будет иметь определенного значения.