关于 C++ 指针和函数

3

我有一段 C++ 代码。

int* func(int n) {
    int* v= &n;
    return v;
}
int main()
{
    int* c = func(5);
    int* k = func(9);
    cout<<*c;
}

这段代码返回的是9,而不是5。当我将函数改为:
int* func(int n) {
    int* v= new int(n);
    return v;
}

这将如预期地返回一个5。第一个为什么不起作用,但第二个起作用?

2
变量 n 是一个本地变量,其生命周期在函数返回时结束。返回指向它的指针是毫无意义的,因为指针会立即失效。 - Some programmer dude
你正在返回一个临时函数参数的地址,这是未定义行为。(即你得到的任何结果都是不可靠的。) - Scheff's Cat
2
第二个变量有另一个问题(与您当前使用函数的方式有关):内存泄漏。您使用“new”分配了内存,但从未使用“delete”释放它。 - Some programmer dude
1个回答

1

func返回了一个指向参数n的指针。请注意,n被声明为按值传递,函数结束时它将被销毁。然后返回的指针总是悬空的,对其进行解引用会导致UB

第二个代码片段没有这样的问题。func返回在函数体中new的指针,即使函数结束后仍然有效。(顺便说一下,返回的指针必须在某处delete以避免内存泄漏。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接