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) 的地址。那是恶业。

您可以尝试按如下方式解决此问题(注意两个额外&的 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

你是正确的,它不应该是deleted 因为它没有被new编辑,但你的代码片段中最大的问题是你正在返回一个指向局部变量的指针i。这意味着返回的指针将没有定义的含义。

于 2013-08-11T11:19:38.640 回答