问题标签 [auto-ptr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - auto_ptr 内容上的三元运算符不起作用
我将 auto_ptr 初始化为 NULL,稍后在游戏中我需要知道它是否有 NULL 以返回它或一个新副本。
我试过这个
还有其他几个类似的东西铸造等等,但是 g++ 试图调用 auto_ptrs 不存在的运算符?(三元运算符)而不是使用 RequestContext* 进行三元比较。
即使我施放它也不起作用。
有什么提示吗?
编辑相等为不相等
c++ - 使非对象资源符合 RAII
在我的代码中,我使用HANDLE
s from windows.h
。它们被用作
如您所见,您必须将其插入CloseHandle
到可能在获取和释放过程中发生的每个异常中。因此,您很可能忘记了一个(或者有一个您不知道的花哨的 SEH 异常)并且瞧,您有内存泄漏。
最近,我读到了关于 RAII 的文章,它应该可以消除这种情况下的麻烦,并且应该CloseHandle
自动调用它。我还看到std::auto_ptr<someType>
在 C++ 中有类似的东西可以解决分配给new
.
但是,由于我不使用new
and 因为HANDLE
is just typedef
ed to be a void *
,所以我想知道我应该如何使用std::auto_ptr<someType>
. 不知何故,应该可以给它一个自定义删除函数(if (!CloseHandle(h)) { throw std::exception("closeHandle error"); }
)。创建一个类将是另一种方法,因为每当它的实例超出范围时都会调用析构函数。但是,为每件简单的事情开设一个班级只是过分了。
如何修复这些意外的内存泄漏?
请注意,我更喜欢纯 C++ 中没有库和大依赖项的解决方案,除非它们真的很小并且无论如何都在大多数环境中使用。
c++ - 这是一个很好的 std::auto_ptr<> 用例吗?
请假设我有一个接受指针作为参数的函数。此函数可以抛出异常,因为它用于std::vector<>::push_back()
管理此指针的生命周期。如果我这样声明:
并这样称呼它:
如果它抛出一个将指针推入的异常std::vector<>
,我实际上有内存泄漏,不是吗?
会像这样声明函数:
解决我的问题?
我希望它首先std::auto_ptr
在堆栈上分配 (我猜这永远不会引发异常)并让它获得对指针的所有权。安全的。
然后,在函数内部,我会将原始指针推入std::vector<>
,这也是安全的:如果失败,则不会添加指针,但智能指针仍将拥有指针,因此它将被销毁。如果推送成功,我将删除智能指针对该指针的所有权并返回:这不会引发异常,所以它总是没问题的。
我的理论正确吗?
- 编辑 -
不,我想我不能那样做。这样做需要对右值进行非常量引用(从智能指针中夺走所有权)。我必须写
为此,在我的情况下,这很不方便。我写这个是为了在不污染代码的情况下实现 RAII。那么,做那件事也无济于事。那将是第 22 条渔获物。
-- 编辑 2 --
将 Jason Orendorff 所说的内容拉下来供读者快速参考,最终的解决方案似乎如下:
这解决了无用的非常量引用右值的问题。
当我完成这门课时,我正在编码,我会把它发回这里,以防有人发现它有用。
-- 编辑 3 --
好的,这里已经讨论了很多,还有一些我之前应该澄清的关键点。一般来说,当我在 stackoverflow 上发帖时,我会尝试解释我的问题背后的原因,一般来说,这是完全没用的。所以这次我想我应该直奔主题。结果发现效果不太好XD
不幸的是,我的大脑现在陷入僵局,所以我想我什至无法正确解释我最初想到的是什么来实现我的目标。我正在尝试为原子操作和异常安全的代码编写找到适合许多情况的良好解决方案,但实际上,我无法处理它 XD 我认为这是我只会随着时间的推移才能掌握的东西。
我是一个非常新的 C++ 程序员,我的重点是游戏开发。当游戏引擎中抛出异常时,就是执行的结束。系统将为我的进程释放所有内存,因此是否有一个或两个指针在这里和那里泄漏并不重要。现在我正在开发一个服务器应用程序,我发现处理异常很困难,因为异常不能使服务器崩溃;它必须“使请求崩溃”。
即“嗯,客户端,可惜开发者没有预见到这种情况,所以你以后得试试(到这里,基本上和游戏引擎一样,什么都没有修复,只是它与请求的上下文隔离,而不是整个过程。但是不要惊慌,因为一切都处于有效状态(但是,这是其中一个区别。过程没有终止,所以操作系统不能为你释放资源,而且你要注意撤消到目前为止的操作,这样你就不会完全锁定一个用户的帐户,甚至是服务器提供的全部服务)。”。
我只会越来越多地编写代码并记下我的问题,以便下次我可以写出更好的问题。我现在不准备问这个,我真的很抱歉。
非常感谢您的回复,我真的很喜欢stackoverflow。令人惊讶的是,我的问题得到了如此快速的回答,而您的回答又如此有启发性。谢谢。
c++ - C++:auto_ptr + 前向声明?
我有这样的课:
在 .cpp 中,构造函数创建一个Inner
with实例,new
析构函数创建delete
它。这工作得很好。
现在我想更改此代码以使用auto_ptr
,所以我写:
现在,构造函数初始化了auto_ptr
,析构函数什么也不做。
但它不起作用。当我实例化这个类时,问题似乎出现了。我收到这个警告:
警告 C4150:删除指向不完整类型“内部”的指针;没有调用析构函数
好吧,这显然很糟糕,我理解它为什么会发生,编译器不知道Inner
实例化模板时的 d'torauto_ptr<Inner>
所以我的问题是:有没有办法auto_ptr
像我在只使用普通指针的版本中那样使用前向声明?
必须对#include
我声明的每个类都声明一个指针是一个巨大的麻烦,有时甚至是不可能的。这个问题一般是怎么处理的?
c++ - 什么是 auto_ptr_ref,它实现了什么以及它是如何实现的
此处的auto_ptr_ref 文档说明了 这一点
This is an instrumental class to allow certain conversions that allow auto_ptr objects to be passed to and returned from functions.
有人可以解释 auto_ptr_ref 如何帮助实现这一目标。我只想了解 auto_ptr 类及其内部结构
c# - How does c++ auto_ptr relate to managed pointers (Java, C#...)
I come from a managed world and c++ automatic memory management is quite unclear to me
If I understand correctly, I encapsulate a pointer within a stack object and when auto_ptr becomes out of scope, it automatically calls delete on the pointed object?
What kind of usage should I make of it and how should I naturally avoid inherent c++ problems?
c++ - 不推荐使用 auto_ptr 吗?
- auto_ptr 会在传入的 C++ 标准中被弃用吗?
- 是否应该使用 unique_ptr 而不是 shared_ptr 进行所有权转移?
- 如果 unique_ptr 不在标准中,那么我需要改用 shared_ptr 吗?
c++ - 我可以通过引用函数来传递 auto_ptr 吗?
以下功能是否OK:
c++ - std::auto_ptr<>::operator = 重置/释放其现有指针?
我在这里读到关于 std::auto_ptr<>::operator=
但是请注意,当左侧对象已经指向某个对象时,它不会自动释放。您可以通过在为其分配新值之前调用成员函数 reset 来显式执行此操作。
但是,当我阅读头文件的源代码时C:\Program Files\Microsoft Visual Studio 8\VC\ce\include\memory
什么是正确/标准的行为?其他 STL 实现如何表现?如果上面引用的网站有错误/过时的信息,您推荐哪个网站作为参考?