【问题标题】:Returning a pointer of a local variable C++返回局部变量 C++ 的指针
【发布时间】:2013-10-03 06:23:43
【问题描述】:

我需要创建一个返回指向 int 的指针的函数。

像这样:

int * count()
{
    int myInt = 5;

    int * const p = &myInt;

    return p;
}

由于指针只是一个地址,而变量 myInt 在调用此函数后被销毁。如何在此方法中声明一个 int,它将在内存中保留一个位置,以便稍后通过返回的指针访问它?我知道我可以在函数外部全局声明 int,但我想在函数内部声明它。

提前感谢您的帮助!

【问题讨论】:

  • 您不能(如您问题中所述)。为什么不将整数指针传递给函数(或者最好还是使用引用)?
  • @EdHeal 他可以使用new int(something) 但这真的很愚蠢......
  • 要获得真正有意义的答案,您可能需要告诉我们更多关于您打算如何使用该变量的信息。例如,如果我连续调用该函数两次,它应该两次返回同一个变量的地址,还是每次都返回一个唯一变量?

标签: c++ function pointers


【解决方案1】:

使用新运算符

int * count()
{
    int myInt = 5;

    int * p = new int;
    *p = myInt;

    return p;
}

正如在其他答案中指出的那样,这通常是一个坏主意。如果您必须这样做,那么也许您可以使用智能指针。请参阅此问题以了解如何执行此操作 What is a smart pointer and when should I use one?

【讨论】:

  • 这会泄漏内存,除非他记得释放它。
  • 是的,我真的应该让一个 const 指针专家来回答这个问题。
  • 恕我直言 - 创建内存的东西应该负责释放它。这个答案打破了这种模式。
  • 如何对数组做同样的事情?即 myInt[10]
  • 这并不能回答问题,每次调用它时,您都会在堆上创建一个新的 int。 OP 想要“此方法中的 int 将在内存中保留一个位置,以便我稍后通过返回的指针访问它?”。 IE。内存中的 single int。 @JonathanPotter 的答案应该是公认的答案。
【解决方案2】:

您可以使用智能指针。

例如:

unique_ptr<int> count()
{
   unique_ptr<int> value(new int(5));
   return value;
}

那么你可以按如下方式访问整数:

cout << "Value is " << *count() << endl;

【讨论】:

    【解决方案3】:

    你可以通过创建变量static来做到这一点:

    int* count()
    {
        static int myInt = 5;
        return &myInt;
    }
    

    【讨论】:

    • 它回答了这个问题。当它是不可能的时候,你为什么要假装它是不可能的?
    • 只是因为它是真的并不意味着它有帮助,如果他不理解静态变量,这会让他困惑几个小时
    • 阅读问题:“如何在此方法中声明一个 int,以便在内存中保留一个位置,以便稍后通过返回的指针访问它?”这正是 static 关键字的作用。
    • 在没有更多上下文的情况下直接说在技术上是正确的但很危险(例如与线程混合时的风险)。
    • 鉴于 OP 的另一个选项是全局变量,这不再危险或令人担忧。它为他提供了一个具有私有范围的全局变量,我认为因为这就是他所要求的,这就是他真正想要的。我认为人们有时会在这里过度分析问题。
    【解决方案4】:

    返回指向局部变量的指针是错误的。 x 指向堆上分配的变量:

    link x = new node(a[m]);
    Thus x isn't pointing to a local variable.
    

    返回一个指向局部变量的指针是一个错误的原因是这样的变量只存在于函数处于活动状态(即在它进入和退出之间)的时间内。在堆上分配的变量(例如使用 new 运算符)一直存在,直到它们被释放(例如使用 delete 运算符)。

    【讨论】:

      【解决方案5】:

      如果你想正确地返回一个变量的指针,你必须做类似的事情。

      int * myInt = new int(5);

      顺便说一句,这不是一个局部变量,这意味着它没有自动存储,你必须自己delete内存

      但是,使用这样的指针通常是不必要且不建议的。最好在函数外部创建一个 int 并让函数进行引用。

      void count(int & i)
      {
          i = 5;
      }
      

      顺便说一句,我不知道您打算如何使用该变量,但由于您还建议使用全局变量,您可能希望使用@JonathanPotter 首先建议的static var。在许多方面,静态变量类似于全局变量(两者都有静态存储持续时间)

      【讨论】:

      • @JonathanPotter 我的错字
      猜你喜欢
      • 2020-10-13
      • 2014-05-14
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      相关资源
      最近更新 更多