假设我有这段代码。
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'分配的内存。这肯定不是这种情况。
答案 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}的指针}}。这意味着返回的指针没有明确的含义。