【问题标题】:Regading C++ pointers and functions [duplicate]重新编写 C++ 指针和函数 [重复]
【发布时间】:2021-08-11 22:28:16
【问题描述】:

我有一个 C++ 代码。

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

此代码返回 9 而不是 5。 但是,当我将 func 更改为

int* func(int n) {
    int* v= new int(n);
    return v;
}

这会按预期返回 5。第一个不起作用但第二个起作用的原因是什么?

【问题讨论】:

  • 变量n是一个本地变量,函数返回时生命周期结束。返回一个指向它的指针是没有意义的,因为指针会立即失效。
  • 您正在返回一个临时函数参数的地址。那是未定义的行为。 (即你得到的任何东西都是不可靠的。)
  • 第二个变体还有另一个问题(与您当前使用该函数的方式有关):内存泄漏。你用new分配内存,但你从来没有delete它。

标签: c++ function pointers


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多