问题标签 [unique-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 投票
2 回答
489 浏览

c++ - 编写可以处理隐式共享的容器,但为不可复制的类型(如 unique_ptr)关闭它?

我挖出了一个旧Grid类,它只是一个以类型为模板的简单二维容器。要制作一个,您可以这样做:

我试图将其设为“Qt-ish”...例如,它根据 进行大小操作QSize,并且您使用myGrid[QPoint (x, y)]. 它可以采用布尔掩码并对设置了掩码位的元素进行操作。还有一个专业化,如果你的元素是QColor它可以为你生成一个QImage

但我采用的一个主要 Qt 习惯用法是它在后台进行了隐式共享。事实证明,这在我拥有的基于Thinker-Qt的程序的基于 QColor 的网格中非常有用。

但是:-/ 我也碰巧遇到过一些我写过以下内容的情况:

当我从auto_ptrC++11's升级时unique_ptr,编译器理所当然地抱怨。隐式共享需要能够在需要时制作相同的副本……并且auto_ptr通过将复制与所有权转让混为一谈,从而消除了这个错误。不可复制类型和隐式共享根本不混合,并且unique_ptr很友好地告诉我们。

(注意:碰巧我在实践中没有注意到这个问题,因为 的用例auto_ptr是通过引用传递网格......从不通过值。不过,这是糟糕的代码......以及 C 的主动性++11 在潜在问题发生之前指出了它。)

好的,那么...我如何设计一个可以打开和关闭隐式共享的通用容器?当我使用 Grid 时,我确实需要许多 Grid 功能,auto_ptr如果对不可复制的类型禁用复制,那就太好了……这会捕获错误!但是,当类型恰好是可复制的时,默认情况下具有隐式共享工作是很好的。

一些想法:

  • 我可以根据您的口味制作单独的类型 ( NonCopyableGrid, CopyableGrid)...或 ( UniqueGrid, )...Grid
  • 我可以将标志传递给Grid构造函数
  • 我可以使用静态工厂方法(Grid::newNonCopyable, Grid::newCopyable),但它会在后台调用相关的构造函数......也许更具描述性
  • 如果可能,我可能会“检测”包含类型的可复制性,然后在实现中利用QSharedDataPointer或不利用,这取决于?

有什么好的理由选择其中一种方法而不是其他方法,或者人们是否针对这种情况采用了更好的方法?

0 投票
4 回答
1240 浏览

c++ - 在 unique_ptr 上使用强制转换运算符是否危险?

我们有一个广泛的代码库,目前使用原始指针,我希望迁移到 unique_ptr。但是,许多函数期望原始指针作为参数,并且在这些情况下不能使用 unique_ptr。我意识到我可以使用 get() 方法来传递原始指针,但这增加了我必须接触的代码行数,而且我觉得它有点难看。我推出了自己的 unique_ptr,如下所示:

然后,每次我向需要原始指针的函数 parm 提供 my_unique_ptr 时,它都会自动将其转换为原始指针。

问题:这样做有什么本质上的危险吗?我原以为这会是 unique_ptr 实现的一部分,所以我假设它的遗漏是故意的——有人知道为什么吗?

0 投票
2 回答
1809 浏览

c++ - unique_ptr 的取消引用运算符在 Eclipse 中不起作用

按照本文中的步骤进行操作,我设法让 Eclipse (Indigo) 识别unique_ptr(以及其他 C++11 新内容)。问题是Eclipse 似乎不支持operator->for 。unique_ptr这里有一个例子:

案例1按预期工作:没有错误并且自动完成工作。但是,对于 case 2,Eclipse 会将该语句标记为错误(“方法 'bar' 无法解析”),并且自动完成 fromfoo->不起作用。

最有趣的是,我对std::shared_ptr. 它只发生在std::unique_ptr.

有没有人遇到过同样的问题?有谁知道修复它的方法?

编辑:只是为了澄清目的,编译过程对于上面显示的代码片段来说很好。所以,问题不在于编译器本身,而在于 Eclipse。

0 投票
2 回答
2240 浏览

c++ - 在空指针的情况下,shared_ptr 和 unique_ptr 的删除器的标准行为是否不同?

好的,首先是一些可能相关的事情:

我在 C++11 模式下使用 Clang 3.1 编译器,标准库设置为 libc++。

我正在尝试让自己熟悉 C++11,在这样做的过程中,我遇到了看起来很奇怪的行为。这可能是 Clang 或 libc++ 的一个怪癖,但我不会说 C++ 标准语言,而且我无法访问其他支持 C++11 的编译器,所以我无法真正检查它,我已经搜索了互联网和 Stack Overflow尽我所能,没有找到任何相关的东西……所以我们开始吧:

当使用 shared_ptr / unique_ptr 为简单资源实现 RAII 时,它们的行为似乎在删除时针对空指针而有所不同。我意识到通常没有必要删除空指针,但我曾期望该行为至少在两个 STL 智能指针之间匹配。

对于特定情况,请考虑以下代码:

我本来期望从中得到以下输出之一:

a) 如果两个删除器都被调用,即使指针为空:

b) 如果因为指针为空而没有调用删除器:

但我没有观察到这两种情况。相反,我观察到:

这意味着正在调用一个而不是另一个删除器。经过进一步调查,我发现shared_ptr的删除器被调用,无论它是否持有空值,但unique_ptr的删除器只有在它不持有空值时才会被调用。

我的问题:这实际上是标准规定的正确行为吗?如果是这样,为什么两种 STL 类型之间的指定行为会以这种方式有所不同?如果不是,这是我应该向 libc++ 报告的错误吗?

0 投票
2 回答
103 浏览

c++ - 有人可以解释这个 unique_ptr 代码发生了什么吗?

这是使用 unique_ptr 的代码:

运行的输出是:

我原以为通话会bar()失败,因为据我所知,应该会因为ingup而被破坏。看来我没有正确理解。有人可以带我了解正在发生的事情吗?(g++ 4.7.0)vmove

0 投票
2 回答
2756 浏览

c++ - 使用带有自定义释放器的 std::unique_ptr 来包装原始指针

我正在尝试将libsvm用于某个复杂的应用程序,并且由于 libsvm 主要是一个 C 库,因此在加载某些数据后,必须使用自定义 API 函数来释放内存。这就是我的意思:

这些是我使用的 libsvm API 函数的定义:

虽然这工作得很好,但如果在我处理模型数据时发生异常,那么我最终会出现内存泄漏。为了防止这种情况,我将上面的代码包装在一个类中,我svm_load_model在其中调用构造函数和svm_free_and_destroy_model析构函数。

现在,由于我们处于智能指针时代,我正在考虑获得更多创意,并且以某种方式将模型变量声明为std::unique_ptr,将指向的指针设置svm_free_and_destroy_model为自定义解除分配器,但不幸的是,我不是能够弄清楚这样的事情是否可行。目前,我什至无法编译它,我只是在黑暗中拍摄。以下是我认为它应该如何工作:

0 投票
1 回答
5039 浏览

c++ - 这是在 C++11 中使用 unique_ptr 和 move-semantics 实现 pimpl 的正确方法吗

我还没有看到同时使用 unique_ptr 和 move-semantics 的 pimpl 示例。

我想向 STL 派生容器添加一个 CHelper 类,并使用 pimpl 隐藏 CHelper 的功能。

这看起来对吗?

派生的.h

`

助手.h

助手.cpp

0 投票
4 回答
69822 浏览

c++ - 如何传递 std::unique_ptr ?

我第一次尝试使用 C++11 unique_ptr;我正在替换我的一个项目中的多态原始指针,该项目归一个类所有,但经常传递。

我曾经有这样的功能:

但我很快意识到我无法切换到:

因为调用者必须处理指向函数的指针所有权,这是我不想要的。那么,我的问题的最佳解决方案是什么?

我虽然将指针作为参考传递,如下所示:

但是这样做我感到非常不舒服,首先因为传递已经输入作为参考的东西似乎不是本能的_ptr,什么是参考的参考。其次,因为函数签名变得更大。第三,因为在生成的代码中,需要两个连续的指针间接访问我的变量。

0 投票
2 回答
2895 浏览

c++ - std::shared_ptr 或 std::unique_ptr 赋值运算符重载

我看不出为什么这些没有为它们模板化的类型的普通旧指针的赋值运算符重载的原因。如果使智能指针接口尽可能接近普通旧指针的目标,那么他们为什么不像这样为赋值运算符进行重载呢?

这样你就可以像使用普通指针一样使用它们,如下所示:

这根本不是问题,只是想知道他们为什么要麻烦地重载几个运算符。

还想知道是否有办法重载全局赋值运算符来执行此操作,或者是否有任何理由我不应该这样做。

编辑:在此处添加对 Nawaz 关于代码格式的回答的回复。我刚刚写了这个测试程序,看看你说的是否正确:

这里的错误是说没有从peh<int>to的可用转换int *。那么为什么 to 可以接受std::shared_ptr<int>int *

0 投票
3 回答
1546 浏览

c++ - Visual Studio 2010 中 unique_pointer 的奇怪行为

我试着写这门课

其中 UniqueElement 是在别​​处定义的 POD 类。我现在像这样定义构造函数体:

它无一例外地遵守。运行程序我发现在构造函数ContainerUnique被调用后,u包含一个空指针。

这是预期的行为吗?我实际调用的是什么 unique_ptr 方法?