问题标签 [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++ - 如何一次重置大量类成员,而不是在析构函数中?
我有一个包含许多简单类类型成员的类。更重要的是,随着我的发展,他们的数量正在增长。
我需要能够一次将它们全部重置,并且我想在不复制粘贴的情况下进行操作。代码目前看起来像:
显然,我不喜欢将每个新成员都添加到reset()
函数中(只是因为忘记了一个而出现了段错误)。
我打算做的是将它们全部收集到一个结构中,并将这个结构分配到auto_ptr
. 所以代码看起来像这样:
DbProxy 的对象不打算被复制或复制构造,尽管我没有费心通过将赋值和复制ctor 设为私有来确保这一点。
你觉得这种方法有什么问题吗?您还有其他建议吗?
编辑
根据@DeadMG 的建议,这个怎么样:
c++ - 将 shared_ptr 转换为 auto_ptr?
我需要在我的代码中从 shared_ptr 获取 auto_ptr。我可以做反向操作 - 将 auto_ptr 转换为 shared_ptr 因为 shared_ptr 有这样的构造函数:
我可以将 shared_ptr 转换为 auto_ptr 吗?还是设计上不可能?
c++ - 放开 auto_ptr
偶尔,对于稍纵即逝的时刻,我认为 auto_ptr 很酷。但大多数时候,我认识到有更简单的技术使它变得无关紧要。例如,如果我想自动释放一个对象,即使抛出异常,我也可以新建对象并分配给 auto_ptr。很酷!但是我可以更轻松地将我的对象创建为局部变量,并让堆栈来处理它(呃!)。
因此,当我发现google C++ 编码标准禁止使用 auto_ptr 时,我并没有太惊讶。谷歌声明应该使用 scoped_ptr (如果需要智能指针)。
我想知道是否有人,与我的经验相反,可以给出一个充分的理由说明 auto_ptr 何时是最好或最简单的使用方法。如果没有,那么我想我会禁止自己使用它(跟随谷歌的领导)。
更新:对于那些表示担忧的人,不,我没有采用谷歌标准。例如,根据谷歌的建议,我同意应该激活异常处理。我也喜欢使用预处理器宏,例如我制作的可打印枚举。让我印象深刻的只是 auto_ptr 主题。
update2:原来我的回答来自下面的两个响应者,以及来自 Wikipedia 的注释。首先,Herb Sutter 确实展示了一个有效的用途(源-汇成语和生命周期关联的对象组合)。其次,有些商店 TR1 和 boost 不可用或被禁止,只允许使用 C++03。第三,根据 Wikipedia,C++0x 规范正在弃用 auto_ptr 并将其替换为 unique_ptr。所以我的答案是:如果我可以使用 unique_ptr(在所有考虑的平台上),则使用 auto_ptr 用于 Sutter 描述的情况。
c++ - 使用 C++ 传递指向 auto_ptr 的指针
我有一个功能可以做到这一点:
我将能够在另一个具有以下签名的函数中调用此函数:
但是当我尝试这样做时,我遇到了编译器错误:
无法将第一个参数从 MyClass * 转换为 std::auto_ptr<_Ty>
为什么?感谢您的任何帮助
编辑 1 询问 myparams 类型是正常的,但也有一个 T 参数,因为该函数在模板类中
c++ - 将 auto_ptr 作为参数传递给构造函数
我希望能够将 auto_ptr 作为参数传递给构造函数。但是如果无法创建新对象(可能没有内存),那么我希望原始 auto_ptr 能够保留其值。
例如:
在函数 foo() 中,由于内存不足,没有创建新对象 B,并且当 new 运算符返回而不创建对象时,autop1 值被破坏。当我们尝试访问 autop1 时,会导致 seg 错误。有什么好的方法可以避免这个问题。如果创建了一个新对象并将所有权传递给它的成员变量,那也没关系。如果无法创建新的 B 对象并且 autop2 将具有 NULL,我希望能够在 foo() 中使用 autop1。
c++ - 为什么 std::auto_ptr 上不允许使用运算符 []
为什么 std::auto_ptr 上不允许使用运算符 []?
在 Microsoft Visual C++ 2010 上编译。
错误:错误 C2676:二进制“[”:“std::auto_ptr<_Ty>”未定义此运算符或转换为预定义运算符可接受的类型
c++ - g++ 的“调用没有匹配的函数”错误:构造函数或运算符 = 不匹配?
我有一个赋值运算符。
当我期望 g++ 编译器为这段代码找到这个运算符时。
我得到编译错误。
为什么是这样?MSVC 编译此代码没有问题。
来源如下。
添加
AP(const AP<T>& o) : Super(o) { }
,我得到了这些错误。
添加2
我不知道这是最好的解决方案,但这段代码似乎有效。
c++ - std::auto_ptr 错误
对于以下 C++ 代码,我收到编译器错误:
我无法理解为什么会收到错误 C2039?我正在使用 VS 2008 编译器。
请帮忙。谢谢
c++ - 删除指向不完整类型和智能指针的指针
当尝试将 anauto_ptr
与使用前向声明声明的类型一起使用时,如下所示:
的析构函数A
没有被调用(显然,因为auto_ptr
内部delete
s 底层指针和不完整类型的析构函数不能被调用)。
但是,相同的代码可以正常工作,并且在使用std::shared_ptr
而不是std::auto_ptr
. 这怎么解释?
c++ - 删除 boost::bind 的原始指针参数
假设我分配了堆A*
,我想将其作为参数传递给boost::bind
.
boost::bind
保存在一些 STL 中以供以后处理,例如boost::functions
's 的容器。
我想确保A*
将在销毁 STL 容器时被销毁。
演示:
如何做呢?
编辑
也许我想要的不是那么现实。
我有原始指针和接收原始指针的函数。调用通过boost::bind延迟。在这一点上,我想要自动内存管理,以防 boost::bind 想要执行。我很懒,所以我想使用“准备好的”智能指针解决方案。
std::auto_ptr看起来是一个不错的候选者,但是......
不编译(见这里)
pAutoA 被破坏,删除底层 pA。
编辑 02
在提到的容器中,我需要存储带有不同参数的杂项“回调”。其中一些是指向对象的原始指针。由于代码很旧,我并不总是可以更改它。
为在容器中存储回调编写自己的包装器是最后的手段(虽然可能是唯一的),因此是赏金。