我需要不断在嵌入式系统中运行应用程序。在实现此应用程序时,我需要从Heap分配大量内存。如果我使用auto_ptr,那么什么时候会被释放?根据我的理解,自动指针指向的内存将在退出/终止应用程序时被释放。如果不退出应用程序,它将不会自动释放。 我可以使用reset()释放内存,如下所示。
auto_ptr<Test> testPtr(new Test);
testPtr.reset();
但是,如果我这样做,auto_ptr的目的就会失败。如果我可以在所有地方进行重置(),我也可以在所有地方进行删除。
请告诉我,即使应用程序未退出,auto_ptr指向的内存是否会被释放。如果没有,除了调用reset()之外,还有其他方法可以释放内存吗?
编辑:在我的情况下,auto_ptr在一个类中。只有在退出应用程序时才会销毁该类对象。当应用程序无限运行时,类对象不会被销毁。因此这个问题。请考虑一下。
编辑:答案:因为我使用相同的auto_ptr存储其他对象,每次我做任务时,auto_ptr赋值运算符将负责删除以前的对象。因此即使没有调用重置也没有泄漏。
答案 0 :(得分:4)
auto_ptr
为您提供了两件事:
如果/当你有全局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
陈述等。