问题标签 [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 投票
4 回答
245316 浏览

c++ - unique_ptr 和 shared_ptr 的区别

可能的重复:
pimpl:shared_ptr 或 unique_ptr
智能指针(boost)解释

有人可以解释 shared_ptr 和 unique_ptr 之间的区别吗?

0 投票
5 回答
4929 浏览

c++11 - 如何通过指针从容器中删除 unique_ptr?

使用 unique_ptr 创建对象并赋予容器所有权是没有问题的。如何通过原始指针删除元素?

0 投票
6 回答
71102 浏览

c++ - make_unique 和完美的转发

std::make_unique为什么标准 C++11 库中没有函数模板?我发现

有点冗长。下面的不是更好吗?

new很好地隐藏了类型,并且只提到了一次类型。

无论如何,这是我尝试实现的make_unique

我花了很std::forward长时间来编译这些东西,但我不确定它是否正确。是吗?究竟是什么std::forward<Args>(args)...意思?编译器对此有何看法?

0 投票
3 回答
1217 浏览

c++ - C++0x unique_ptr 误解?

N2812中是引言中的一个示例,其中 aunique_ptr作为值参数给出

本文讨论了 RValue/LValue 重载解析的问题,但这不是我的意思。

我想知道,如果std::unique_ptr<int> a 按值提供参数不会导致编译器错误?它会复制它,对吗?这是不允许unique_ptr

我知道这篇论文已经很老了,也许从那以后,它的定义unique_ptr已经改变了。但也许这只是一个错字,作者想改写std::unique_ptr<int> &a

我的 gcc 4.7.0 同意我的观点,但这没有证据 :-)

0 投票
3 回答
5444 浏览

c++ - 将 std::unique_ptr 作为参数传递给函数

我得到了一个结构和一个函数,如下所示:

我正在获得一个指向 MYOVERLAPPED 的指针,我想将它传递给 func1 函数。我遇到的问题是,无论我尝试什么,我都会收到以下错误:

我已经尝试过以下内容:Try1:

错误:错误 1 ​​错误 C2440:“正在初始化”:无法从“_OVERLAPPED **”转换为“MYOVERLAPPED *”

尝试2:

错误 1 ​​错误 C2664:“HandleAcceptIndication”:无法将参数 1 从“MYOVERLAPPED *”转换为“std::unique_ptr<_Ty>”

任何人都知道我如何可以将 OVERLAPPED 的这个转换指针传递给 MYOVERLAPPED 到函数,以及为什么 Try2 也不起作用,因为我随便使用std::unique_ptr<MYOVERLAPPED> pO(new MYOVERLAPPED) which 确实有效......?

0 投票
2 回答
560 浏览

sorting - C ++如何使用lambda函数对unique_ptrs向量进行动态排序?

所以我有一个std::vector<std::unique_ptr<Base>> vec并且我正在尝试对其进行动态排序,因为 Derived1 与 Derivedn 之间存在逻辑比较(Derivedn always > Derivedn-1 > ... > Derived1)(比如 n = 10 左右)并且每个 Derivedx 都有它与 Derivedx 有不同的比较。例如,考虑 10 位整数 > 9 位整数 > 1 位整数,但在每个派生类中 53 > 32(但我没有对整数进行排序)。

所以我可以这样做:

然后在Base中,Base::operator<(const Base& b)如果它们是不同的派生类,则有一个函数进行比较,如果它们相同,则转换为Derivedx,Derivedx::operator<(const Derivedx& d)如果它们是相同的派生类。

但是,我认为有一种方法可以根据派生类中的适当定义自动将 a 与 b 进行比较,但由于编译错误,我无法实现它。我无法让 lambda 函数动态比较 Derivedx < Derived。

我试过Base::operator<(const std::unique_ptr<Base>)然后使用return *a<b编译器错误,说我使用了删除的复制赋值运算符(我不明白,赋值在哪里??)。抽象虚拟Base::operator<(const Base& b)实际上与我现在正在做的事情相同,但需要更多的工作,因为我必须实现Derivedx::operator<(const Base& b)(对于每个 Derivedx),然后如果它们相同,则将其转换为 (Derivedx)。

不过,我比较基类中的所有内容而不是在(n 个派生类中的 n 个比较)中实现 n^2 比较可能会更好。但我确实想看看我是否可以保持“面向对象”。

对设计问题有任何想法吗?
谢谢。

0 投票
3 回答
182 浏览

c++ - C++11 指针唯一帮助函数

在 C++11 中,我缺少用于将指针唯一化到std::unique_ptr. 因此,我编写了以下小辅助函数std::uniquify_ptr,通常用于轻松(非构造函数)分配可变类成员(通常是不同类型的缓存)。

从安全的角度来看,我在这里遗漏了什么吗?是否已经有一些类似的功能可用?

0 投票
1 回答
1503 浏览

c++ - unique_ptr 删除程序导致我的程序崩溃

在运行时,当我关闭程序时出现错误:“crt 检测到应用程序在堆缓冲区结束后写入内存。” 我通过析构函数跟踪程序执行到唯一 ptr 的删除器,并且在调用删除器函数时发生错误。我要提到的另一个问题是,由于某种原因,唯一 ptr 所在的类定义要求它具有公共复制构造函数。我试图在另一个项目中用不同的类和相同的类复制这些问题,删除复制构造函数和析构函数并更改访问实验室。我无法复制相同的问题 - 这两个项目之间最大的区别是有问题的是共享库,这可能是问题吗?必须定义复制构造函数虽然烦人且多余,但我并不真正关心,任何关于此内存错误的推测或建议将不胜感激。

0 投票
1 回答
1986 浏览

c++ - c++ 我可以将 std::unique_ptr 与依赖注入一起使用吗?

我一直在使用原始指针进行依赖注入,我决定将我的代码转换为使用 shared_ptr。这可行,但我想知道是否可以使用 unique_ptr 代替?在下面的示例中,MyClass 将管理信用卡服务的生命周期。

您可以将 unique_ptr 传递给另一个类,而另一个类只是“使用”指针(不拥有它??)?如果是这样,这是一个好主意吗?PaymentProcessor 的构造函数中的参数类型应该是什么?

更新

在如上所示的示例中,我也可以VisaCardService在堆栈上创建一个变量,并让PaymentProcessor构造函数将其作为参考参数。这似乎是推荐的 C++ 实践。然而,如果 creditCardService_ 的具体类型直到运行时才知道(例如,用户选择在运行时使用的特定信用卡服务),使用std::unique_ptrwith references 是最好的解决方案吗?

0 投票
7 回答
216116 浏览

c++ - 如何将 unique_ptr 参数传递给构造函数或函数?

我是 C++11 中移动语义的新手,我不太了解如何处理unique_ptr构造函数或函数中的参数。考虑这个类引用自己:

这是我应该如何编写带unique_ptr参数的函数吗?

我需要std::move在调用代码中使用吗?