在返回地址之前取消指针

时间:2014-08-31 13:21:08

标签: c++ pointers c++11

在下面的代码中,为了安全起见,我想在返回它存储的地址之前使指针无效。我怎么能这样做?

int& foo (vector<int>& vec)
{
    double dis = 1e6;
    int* ptr = NULL;

    for (int& i: vec)
    {
        tmp = calculate (i);

        if (tmp < dis)
        {
            dis = tmp;
            ptr = &i;
        }
    }

    if (ptr != NULL)
    {
        // How to nullify the ptr?
        return *ptr;
    }
}

1 个答案:

答案 0 :(得分:4)

您应该将迭代器返回到位置,而不是指针。 迭代器和指向int的指针的有效期都是相同的。 这样你就可以通过返回vec.end()来处理没有找到结果的情况。

vector<int>::iterator foo (vector<int>& vec)
{
    double dis = 1e6;
    auto result = vec.end();

    auto it_end = vec.end();
    for (auto it = vec.begin(); it != it_end; ++it)
    {
        const double tmp = calculate (*it);

        if (tmp < dis)
        {
            dis = tmp;
            result = it;
        }
    }

    return result;
}

以防其他人提到std::min_elment。 这不适用于此,因为foo调用calculate n次,而std::min_element则称之为2 *(n-1)次。