C++ 在应用程序永不停止的情况下,auto_ptr指向的内存是否会泄漏?

C++ 在应用程序永不停止的情况下,auto_ptr指向的内存是否会泄漏?,c++,C++,我需要在嵌入式系统中连续运行应用程序。在实现这个应用程序时,我需要从堆中分配大量内存。如果我对这些应用程序使用auto_ptr,什么时候可以释放?根据我的理解,自动指针指向的内存将在退出/终止应用程序时释放。若应用程序未退出,它将不会自动释放。 我可以使用reset()释放内存,如下所示 auto_ptr<Test> testPtr(new Test); testPtr.reset(); 自动测试(新测试); testPtr.reset(); 但是,如果我这样做的话,auto_p

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

auto_ptr<Test> testPtr(new Test);
testPtr.reset();
自动测试(新测试);
testPtr.reset();
但是,如果我这样做的话,auto_ptr的目的就会失败。如果我可以在所有位置执行reset(),那么我也可以在所有位置执行delete

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

编辑:在我的例子中,auto_ptr在一个类中。该类对象只有在退出应用程序时才会被销毁。由于应用程序无限运行,类对象不会被销毁。这就是问题所在。请考虑这一点。


编辑:回答:由于我使用相同的自动\u ptr存储其他对象,每次我进行赋值时,自动\u ptr赋值操作符都会负责删除以前的对象。因此,即使不调用重置,也不会发生泄漏。

当auto_ptr实例被销毁时,auto_ptr指向的内存被释放。对于在函数中定义的本地auto_ptr实例,这在函数退出时发生。若auto_ptr实例是类成员,则在销毁容器类实例时销毁该实例。当程序退出时,全局自动\u ptr实例被销毁。

当自动\u ptr实例被销毁时,自动\u ptr指向的内存被释放。对于在函数中定义的本地auto_ptr实例,这在函数退出时发生。若auto_ptr实例是类成员,则在销毁容器类实例时销毁该实例。当程序退出时,全局自动\u ptr实例将被销毁。

auto\u ptr
为您提供两件事:

  • 转让转让所有权
  • 当拥有的auto_ptr被销毁时,它所拥有的数据也会被销毁
  • 只有当您拥有全局auto_ptr对象时,退出的应用程序才会变得相关——这在一开始就没有什么意义。引用动态分配对象的全局auto_ptr通常可以通过使对象本身为全局对象来替换(但您通常希望避免两者)


    对于auto_ptr的大多数正常使用,退出应用程序并不重要——重要的是退出定义auto_ptr的范围。此时,它所拥有的对象将被删除。

    auto\u ptr
    为您提供两件事:

  • 转让转让所有权
  • 当拥有的auto_ptr被销毁时,它所拥有的数据也会被销毁
  • 只有当您拥有全局auto_ptr对象时,退出的应用程序才会变得相关——这在一开始就没有什么意义。引用动态分配对象的全局auto_ptr通常可以通过使对象本身为全局对象来替换(但您通常希望避免两者)


    对于auto_ptr的大多数正常使用,退出应用程序并不重要——重要的是退出定义auto_ptr的范围。此时,它所拥有的对象将被删除。

    auto_ptr类的析构函数将在调用构造函数时调用指定指针上的delete运算符,即
    new Test
    。调用
    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
    }
    
    void foo()
    {
    //…做些工作
    {
    自动测试(新测试);
    //…用testPtr做点什么
    }//*此时testPtr不再在范围内,指针由该对象持有
    //将被删除
    //…做一些额外的工作
    }
    

    现在很明显,您不必费心使用scope(即{}),只需调用
    auto_ptr::reset()
    ,我在其中标记了*但此方法的优点是在存在异常和
    return
    语句等情况下工作

    当调用构造函数时,auto_ptr类的析构函数将调用您指定的指针上的delete操作符,即
    newtest
    。调用
    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
    }
    
    void foo()
    {
    //…做些工作
    {
    自动测试(新测试);
    //…用testPtr做点什么
    }//*此时testPtr不再在范围内,指针由该对象持有
    //将被删除
    //…做一些额外的工作
    }
    

    现在很明显,您不必费心使用scope(即{}),只需调用
    auto_ptr::reset()
    ,我在其中标记了*但此方法的优点是在存在异常和
    return
    语句等情况下工作

    @Alex:就我而言,auto_ptr在一个类中。该类对象只有在退出应用程序时才会被销毁。由于应用程序无限运行,类对象不会被销毁。这就是问题所在。@bj:那有什么问题?在程序结束之前,类需要该资源。没有要更改的内容。@GMan:每次有外部事件到达我的应用程序时,我都想将auto_ptr指向一个新对象。所以我想,我需要执行reset()并再次使用指针。@bjskishore:听起来你想使用
    auto\u ptr
    assig