0

我想我可能会在这里造成内存泄漏:

   void commandoptions(){
      cout<< "You have the following options: \n 1). Buy Something.\n  2).Check you balance. \n3). See what you have bought.\n4.) Leave the store.\n\n Enter a number to make your choice:";
      int input;
      cin>>input;
      if (input==1) buy();
      //Continue the list of options.....
      else
      commandoptions(); //MEMORY LEAK IF YOU DELETE THE ELSE STATEMENTS!
   }

inline void buy(){
    //buy something
    commandoptions();
}

假设 commandoptions 在程序第一次运行时刚刚执行。用户选择“1”,表示 buy() 子程序由 commandoptions() 子程序执行。

buy() 执行后,它再次调用 commandoptions()。

第一个 commandoptions() 会返回吗?还是我只是造成了内存泄漏?

如果我创建一个只调用自身的子例程,它将导致堆栈溢出,因为该子例程的其他“循环”永远不会退出。我在这里做/接近做吗?

请注意,我inline在购买时使用了关键字...这有什么不同吗?

我很高兴地问我的教授,他似乎没有空。:/

编辑:我不敢相信我没有想到使用循环,但是谢谢,我学到了一些关于我的术语的新东西!

4

5 回答 5

7

内存泄漏是您使用new如下方式分配一些内存的地方:

char* memory = new char[100]; //allocate 100 bytes

然后你就忘记了,用了这段记忆之后delete的记忆

delete[] memory; //return used memory back to system.

如果您忘记了,delete那么您将在程序运行时将此内存保留为正在使用的状态,并且不能再用于其他用途。看到内存是一种有限的资源,例如,在没有终止程序的情况下执行数百万次,最终会导致您没有可用的内存。

这就是我们自己清理的原因。

在 C++ 中,您会使用像 RAII 这样的惯用语来防止内存泄漏。

class RAII
{
public:
    RAII() { memory = new char[100]; }
    ~RAII() { delete[] memory }
    //other functions doing stuff
private:
   char* memory;
};

现在你可以使用这个 RAII 类,就像这样

{ // some scope
RAII r; // allocate some memory

//do stuff with r

} // end of scope destroys r and calls destructor, deleting memory

您的代码没有显示任何内存分配,因此没有可见的泄漏。

您的代码似乎确实有无限递归,没有终止递归的基本情况。

于 2013-05-07T15:55:37.140 回答
5

这基本上是一个没有基本情况的递归。所以,递归永远不会结束(直到你用完堆栈空间)。

对于您要执行的操作,最好使用循环而不是递归。

并回答您的具体问题:

  • 不,commandoptions永远不会回来。
  • 如果您对内存泄漏使用非常广泛的定义,那么这就是内存泄漏,因为您正在创建堆栈帧而没有再次删除它们。大多数人不会这样标记它(包括我)。
  • 是的,你最终确实会导致堆栈溢出。
  • inline关键字不会对此产生影响。
于 2013-05-07T15:53:23.323 回答
5

Inline 关键字不会导致内存泄漏。

如果这是您拥有的所有代码,则不应存在内存泄漏。看起来你确实有无限递归。如果用户键入“1”,则commandoptions()buy(). 假设他们在那个中键入“1”。无限重复,然后您最终会因为堆栈太深而崩溃。

即使用户没有键入“1”,您仍然会在 elsecommandoptions()内部再次调用commandoptions(),这将得到完全相同的结果——由于无限递归而导致崩溃。

但是,我没有看到给出的确切代码存在内存泄漏。

于 2013-05-07T15:54:25.017 回答
2

这不是关于,无论 的值是什么memory leak,您都在无限调用函数,这将导致堆栈崩溃。您的函数中需要一些退出点。commandoptionsinputcommandoptions

于 2013-05-07T15:54:19.320 回答
1

这里没有内存泄漏。确实发生的事情(至少在你的那个被屠杀的代码片段中看起来是这样)是你进入了一个无限循环。如果尾调用优化没有启动或您的编译器不支持,您可能会用完堆栈空间(虽然很难看出您的调用是否实际上处于尾部位置)。

于 2013-05-07T15:54:21.870 回答