Удаление указателя, возвращаемого функцией вручную

Допустим, у меня есть этот код.

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’. Это, конечно, не тот случай, здесь.

0

Решение

Краткий ответ: вы правы, что не должны 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
}
2

Другие решения

Вы правы в том, что этого не должно быть deleteд, так как это не было newно самая большая проблема в вашем фрагменте кода в том, что вы возвращаете указатель на локальную переменную i, Это будет означать, что возвращаемый указатель не будет иметь определенного значения.

1

По вопросам рекламы [email protected]