问题标签 [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.

0 投票
5 回答
682 浏览

c++ - 如何一次重置大量类成员,而不是在析构函数中?

我有一个包含许多简单类类型成员的类。更重要的是,随着我的发展,他们的数量正在增长。

我需要能够一次将它们全部重置,并且我想在不复制粘贴的情况下进行操作。代码目前看起来像:

显然,我不喜欢将每个新成员都添加到reset()函数中(只是因为忘记了一个而出现了段错误)。

我打算做的是将它们全部收集到一个结构中,并将这个结构分配到auto_ptr. 所以代码看起来像这样:

DbProxy 的对象不打算被复制或复制构造,尽管我没有费心通过将赋值和复制ctor 设为私有来确保这一点。

你觉得这种方法有什么问题吗?您还有其他建议吗?

编辑

根据@DeadMG 的建议,这个怎么样:

0 投票
5 回答
2892 浏览

c++ - 将 shared_ptr 转换为 auto_ptr?

我需要在我的代码中从 shared_ptr 获取 auto_ptr。我可以做反向操作 - 将 auto_ptr 转换为 shared_ptr 因为 shared_ptr 有这样的构造函数:

我可以将 shared_ptr 转换为 auto_ptr 吗?还是设计上不可能?

0 投票
6 回答
1728 浏览

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 描述的情况。

0 投票
3 回答
1993 浏览

c++ - 使用 C++ 传递指向 auto_ptr 的指针

我有一个功能可以做到这一点:

我将能够在另一个具有以下签名的函数中调用此函数:

但是当我尝试这样做时,我遇到了编译器错误:

无法将第一个参数从 MyClass * 转换为 std::auto_ptr<_Ty>

为什么?感谢您的任何帮助

编辑 1 询问 myparams 类型是正常的,但也有一个 T 参数,因为该函数在模板类中

0 投票
1 回答
504 浏览

c++ - 将 auto_ptr 作为参数传递给构造函数

我希望能够将 auto_ptr 作为参数传递给构造函数。但是如果无法创建新对象(可能没有内存),那么我希望原始 auto_ptr 能够保留其值。

例如:

在函数 foo() 中,由于内存不足,没有创建新对象 B,并且当 new 运算符返回而不创建对象时,autop1 值被破坏。当我们尝试访问 autop1 时,会导致 seg 错误。有什么好的方法可以避免这个问题。如果创建了一个新对象并将所有权传递给它的成员变量,那也没关系。如果无法创建新的 B 对象并且 autop2 将具有 NULL,我希望能够在 foo() 中使用 autop1。

0 投票
4 回答
1022 浏览

c++ - 为什么 std::auto_ptr 上不允许使用运算符 []

为什么 std::auto_ptr 上不允许使用运算符 []?

在 Microsoft Visual C++ 2010 上编译。

错误:错误 C2676:二进制“[”:“std::auto_ptr<_Ty>”未定义此运算符或转换为预定义运算符可接受的类型

0 投票
2 回答
925 浏览

c++ - g++ 的“调用没有匹配的函数”错误:构造函数或运算符 = 不匹配?

我有一个赋值运算符。

当我期望 g++ 编译器为这段代码找到这个运算符时。

我得到编译错误。

为什么是这样?MSVC 编译此代码没有问题。

来源如下。

添加

AP(const AP<T>& o) : Super(o) { },我得到了这些错误。

添加2

我不知道这是最好的解决方案,但这段代码似乎有效。

0 投票
4 回答
2101 浏览

c++ - std::auto_ptr 错误

对于以下 C++ 代码,我收到编译器错误:

我无法理解为什么会收到错误 C2039?我正在使用 VS 2008 编译器。

请帮忙。谢谢

0 投票
1 回答
6678 浏览

c++ - 删除指向不完整类型和智能指针的指针

当尝试将 anauto_ptr与使用前向声明声明的类型一起使用时,如下所示:

的析构函数A没有被调用(显然,因为auto_ptr内部deletes 底层指针和不完整类型的析构函数不能被调用)。

但是,相同的代码可以正常工作,并且在使用std::shared_ptr而不是std::auto_ptr. 这怎么解释?

0 投票
4 回答
1288 浏览

c++ - 删除 boost::bind 的原始指针参数

假设我分配了堆A*,我想将其作为参数传递给boost::bind. boost::bind保存在一些 STL 中以供以后处理,例如boost::functions's 的容器。

我想确保A*将在销毁 STL 容器时被销毁。

演示:

如何做呢?

编辑

也许我想要的不是那么现实。

我有原始指针和接收原始指针的函数。调用通过boost::bind延迟。在这一点上,我想要自动内存管理,以防 boost::bind 想要执行。我很懒,所以我想使用“准备好的”智能指针解决方案。

std::auto_ptr看起来是一个不错的候选者,但是......

不编译(见这里

pAutoA 被破坏,删除底层 pA。

编辑 02

在提到的容器中,我需要存储带有不同参数的杂项“回调”。其中一些是指向对象的原始指针。由于代码很旧,我并不总是可以更改它。

为在容器中存储回调编写自己的包装器是最后的手段(虽然可能是唯一的),因此是赏金。