手动删除函数返回的指针

时间:2013-08-11 11:09:48

标签: c++ return-value nullptr

假设我有这段代码。

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'分配的内存。这肯定不是这种情况。

2 个答案:

答案 0 :(得分:2)

简短的回答:你是对的,你不应该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
}

答案 1 :(得分:1)

你是正确的,它不应该是delete d,因为它不是new,但你的代码片段中最大的问题是你正在返回一个指向局部变量{{1}的指针}}。这意味着返回的指针没有明确的含义。