c++ - 这是一个很好的 std::auto_ptr<> 用例吗?

标签 c++ auto-ptr exception-safe

请假设我有一个接受指针作为参数的函数。这个函数可以抛出异常,因为它使用 std::vector<>::push_back()管理此指针的生命周期。如果我这样声明:

void manage(T *ptr);

并这样称呼它:
manage(new T());

如果它抛出异常将指针插入 std::vector<> ,我实际上有内存泄漏,不是吗?

会像这样声明函数:
void manage(std::auto_ptr<T> ptr);

解决我的问题?

我希望它首先分配 std::auto_ptr在堆栈上(我猜永远不会抛出异常的东西)并让它获得对指针的所有权。安全的。

然后,在函数内部,我将原始指针插入 std::vector<> ,这也是安全的:如果失败,则不会添加指针,但智能指针仍将拥有该指针,因此它将被销毁。如果推送成功,我将删除智能指针对该指针的所有权并返回:这不能抛出异常,所以它总是没问题的。

我的理论正确吗?

- 编辑 -

不,我想我不能那样做。这样做需要对右值进行非常量引用(以从智能指针中夺走所有权)。我必须写
std::auto_ptr<T> ptr(new T());
manage(ptr);

为了让它起作用,在我的情况下这很不方便。我写这个是为了我可以在不污染太多代码的情况下实现 RAII。那么,这样做无济于事。那将是第22条。

-- 编辑 2 --

将 Jason Orendorff 所说的内容拉到这里供读者快速引用,最终的解决方案似乎如下:
void manage(T *ptr)
{
    std::auto_ptr<T> autoPtr(ptr);
    vector.push_back(ptr);
    autoPtr.release();
}

这解决了无用的非常量引用右值的问题。

当我完成这门课时,我正在编码,我会把它贴回这里,以防有人觉得它有用。

-- 编辑 3 --

好的,这里已经讨论了很多,并且有我之前应该澄清的关键点。通常,当我在 stackoverflow 上发帖时,我会尝试解释问题背后的原因,但总的来说,这完全没有用。所以这次我想我应该直奔主题。事实证明它并没有很好地工作XD

不幸的是,我的大脑现在陷入僵局,所以我想我什至无法正确解释我最初想到的实现目标的方法。我正在尝试为原子操作和异常安全代码编写找到一个适合很多情况的好的解决方案,但实际上,我无法处理它XD 我认为这是我只能随着时间掌握的那种东西。

我是一个非常新的 C++ 程序员,我的重点是游戏开发。当游戏引擎抛出异常时,就是执行结束。系统将为我的进程释放所有内存,因此是否有一两个指针在这里和那里泄漏并不重要。现在我正在开发一个服务器应用程序,我发现很难处理异常,因为异常不能使服务器崩溃;它必须“使请求崩溃”。

那就是,“好吧,客户,不幸的是,开发人员没有预见到这种情况,所以你必须稍后尝试(到这里,它与游戏引擎基本相同,没有任何修复,只是它仅与请求的上下文隔离,而不是整个过程。但是不要 panic ,因为一切都处于有效状态(但是,这里有一个区别。过程没有终止,所以操作系统无法为您释放资源;此外,您必须注意撤消到目前为止的操作,以免您完全锁定用户的帐户,例如,甚至服务器提供的完整服务)”。

我只会越来越多地编写代码并记下我的问题,以便下次我可以写出更好的问题。我现在不准备问这个,真的很抱歉。

非常感谢您的回复,我真的很喜欢 stackoverflow。我的问题得到回答的速度如此之快,以及您的回答如此有启发性,这绝对令人惊讶。谢谢。

最佳答案

你可以这样做,但你仍然需要在没有抛出异常的情况下进行清理,这似乎有点麻烦。

如果你使用类似 boost::shared_ptr 的东西(我相信 TR1 库中也有类似的东西 - 例如,请参见 MS's implementation )如果事情按计划进行,您可能会忘记必须进行清理。

要完成这项工作,您需要让您的 vector 接受 boost::shared_ptr < T >实例,那么您只需清理原始实例,并且在一切顺利的情况下,它会使 vector 中的实例保持事件状态。万一出问题了boost::shared_ptr实例将被销毁,您仍然不会泄漏。

对于智能指针,它是关于选择适合任务的指针,在这种情况下,共享所有权(或简单的所有权转移)似乎是一个目标,因此在大多数平台上都有比 std::auto_ptr 更好的候选对象。

关于c++ - 这是一个很好的 std::auto_ptr<> 用例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1777717/

相关文章:

c++ - 使用可变模板的维度无关类

C++:如何获取在同一类的不同函数中定义的元素?

c++ - 不从源函数返回的类中的 auto_ptr

c++ - 有什么理由使用 auto_ptr 吗?

c++ - 关于 auto_ptr 的问题

c++ - 异常安全——何时、如何、为什么?

c++ - 调用库的问题

c++ - C++中包含的C标准库函数是否抛出异常?

c++ - push_back 'dynamically allocated object' 到 vector 安全吗?

c++ - QCompleter::activated disconnected after losing and gaining focus