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