如果永远不会结束应用程序,auto_ptr会指向内存吗?

时间:2010-08-21 05:17:55

标签: c++

我需要不断在嵌入式系统中运行应用程序。在实现此应用程序时,我需要从Heap分配大量内存。如果我使用auto_ptr,那么什么时候会被释放?根据我的理解,自动指针指向的内存将在退出/终止应用程序时被释放。如果不退出应用程序,它将不会自动释放。 我可以使用reset()释放内存,如下所示。

auto_ptr<Test> testPtr(new Test);
testPtr.reset();

但是,如果我这样做,auto_ptr的目的就会失败。如果我可以在所有地方进行重置(),我也可以在所有地方进行删除。

请告诉我,即使应用程序未退出,auto_ptr指向的内存是否会被释放。如果没有,除了调用reset()之外,还有其他方法可以释放内存吗?

编辑:在我的情况下,auto_ptr在一个类中。只有在退出应用程序时才会销毁该类对象。当应用程序无限运行时,类对象不会被销毁。因此这个问题。请考虑一下。

编辑:答案:因为我使用相同的auto_ptr存储其他对象,每次我做任务时,auto_ptr赋值运算符将负责删除以前的对象。因此即使没有调用重置也没有泄漏。

3 个答案:

答案 0 :(得分:4)

auto_ptr为您提供了两件事:

  1. 任务转让所有权
  2. 当拥有auto_ptr被破坏时,它拥有的数据也是
  3. 如果/当你有全局auto_ptr对象时,退出的应用程序才变得相关 - 这首先很少有意义。引用动态分配对象的全局auto_ptr通常可以通过使对象本身为全局来替换(但通常要避免这两者)。

    对于auto_ptr的大多数正常用法,退出应用程序是无关紧要的 - 它正在退出定义auto_ptr的范围。此时,它拥有的对象将被删除。

答案 1 :(得分:3)

当auto_ptr实例被销毁时,auto_ptr指向的内存被释放。对于在函数中定义的本地auto_ptr实例,当函数退出时会发生这种情况。如果auto_ptr实例是类成员,则在销毁容器类实例时会将其销毁。程序退出时会销毁全局auto_ptr实例。

答案 2 :(得分:0)

auto_ptr类的析构函数将在调用构造函数(即new Test)时调用您指定的指针上的delete运算符。调用auto_ptr::reset()具有相同的效果。

好处是您可以使用范围规则来自动销毁auto_ptr实例所指向的对象。

在您的示例中,testPtr正在堆栈上实例化,一旦超出范围就会被销毁。

考虑这个例子:

void foo()
{
  //... do some work

  {
    auto_ptr<Test> testPtr(new Test);

    //... do something with testPtr

  } // *at this point testPtr is no longer in scope and the pointer held by this object
    // will be deleted

  //... do some additional work
}

现在很明显你可能没有打扰使用范围(即{})并且刚刚调用auto_ptr::reset()我标记了* 但是这种方法具有在异常存在的情况下工作的好处return陈述等。