smart-pointers 相关问题

一种抽象数据类型,它在提供附加功能时模拟指针,例如自动垃圾收集或边界检查

std::binary_search 和 lower_bound 以及 unique_ptr 数组

我一直在尝试在 std::array> 上使用 std::binary_search 和 std::lower_bound 来掌握它。我遇到了以下问题: #包括 我一直在尝试在 std::binary_search 上使用 std::lower_bound 和 std::array<unique_ptr<int>> 只是为了掌握它。我遇到了以下问题: #include <array> #include <memory> #include <algorithm> int main() { std::array<std::unique_ptr<int>, 3> a = {std::make_unique<int>(1), std::make_unique<int>(2), std::make_unique<int>(5)}; auto t = std::binary_search(a.begin(), a.end(), 5, [] (std::unique_ptr<int> x, std::unique_ptr<int> y) { return x.get() < y.get(); }); return 0; } 我试图将我自己的比较放在这里,类似于使用std::sort之类的东西来完成。但是,在编译时出现错误cannot convert argument 1 from 'const _Ty' to 'std::unique_ptr<int,std::default_delete<int>>' 我应该改变什么才能使这项工作正常进行? 编辑:来自 Visual Studio 的完整错误消息 Severity Code Description Project File Line Suppression State Details Error C2664 'bool thng_already::<lambda_1>::operator ()(std::unique_ptr<int,std::default_delete<int>>,std::unique_ptr<int,std::default_delete<int>>) const': cannot convert argument 1 from 'const _Ty' to 'std::unique_ptr<int,std::default_delete<int>>' with [ _Ty=int ] Proj C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include\algorithm 7028 当用 std::make_unique<int>(5) 替换 5 时,我们有一个不同的错误 Severity Code Description Project File Line Suppression State Details Error C2280 'std::unique_ptr<int,std::default_delete<int>>::unique_ptr(const std::unique_ptr<int,std::default_delete<int>> &)': attempting to reference a deleted function Proj C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include\algorithm 7028 您的 lambda 按值获取参数。这意味着 binary_search 实现在将参数传递给 lambda 时必须复制参数。可以复制吗unique_ptr?不,这就是它不起作用的原因。改为通过 const 引用获取参数。 int main() { std::array<std::unique_ptr<int>, 3> a = {std::make_unique<int>(1), std::make_unique<int>(2), std::make_unique<int>(5)}; auto t = std::binary_search(a.begin(), a.end(), 5, [](const std::unique_ptr<int>& x, const std::unique_ptr<int>& y) { return x.get() < y.get(); }); return 0; }

回答 1 投票 0

C++中如何处理指针重复删除问题

最近我陷入了一个场景,在项目中同时使用原始指针和智能指针。 我有2节课。 Canvas里面又组成了另一个类CanvasItem。它存储 CanvasItem

回答 1 投票 0

std::unique_ptr 如何在闭包上应用 EBO?

#包括 #包括 int main(){ 自动x1 = [](int *p){ 删除(p); }; 自动 ptr = std::unique_ptr(new int{1},x1); printf("%zu\...

回答 1 投票 0

使用unique_ptr来控制文件描述符

理论上,我应该能够使用自定义指针类型和删除器,以便 unique_ptr 管理不是指针的对象。我尝试了以下代码: #ifndef UNIQUE_FD_H #定义

回答 9 投票 0

复制传递给基类的shared_ptr

所以我有一个小的类层次结构,我需要将一个shared_ptr传递给接受右值的基类。然而,在其中一种情况下,我想获取shared_ptr以用于其中一个

回答 1 投票 0

如何返回结构体指针数组?

我想返回一个结构体指针数组。 我希望结构指针数组可以在主函数中访问。但它总是会破裂。我尝试过使用智能指针,但似乎...

回答 1 投票 0

在程序中调用 execv() 时智能指针的内存何时被清除?

我试图了解在从代码中调用 execv() 时共享(智能)指针拥有的内存何时被清除。 假设以下代码: #包括 类测试 { public: ~...

回答 1 投票 0

用新内存覆盖“对象管理共享指针”C++

我有一个简单的代码,如下所示,我正在试验 - #包括 #包括 类测试类{ 民众: TestClass(int a, int b) : mA(a), mB(b) { 标准...

回答 1 投票 0

Qt::make_shared 用于创建 QSharedPtr 作为 std::make_shared 用于创建 std::shared_ptr

正如 Bjarne Stroustrup 的《C++ 之旅》中所述,作为一种已知的 C++14 实践,应该避免在代码中使用裸露的 new 和删除。标准库为

回答 1 投票 0

unique_ptr声明后如何赋值?

#包括 #include // unique_ptr 使用命名空间 std; int main() { std::unique_ptr char_ptr; char_ptr = (char*)"anisha"; 返回0; } 我是...

回答 3 投票 0

静态函数的共享指针

我正在尝试通过使用智能指针来改进我的编码,并且目前正在尝试使用智能指针替换我们遗留代码库中的所有旧原始指针(std::unique_ptr 和 std::

回答 1 投票 0

C++ std:.auto_ptr 或 std::unique_ptr (支持多个编译器,甚至是旧的 C++03 编译器)?

我正在尝试更新一些C++代码,我想转向更现代的代码(c++11),但我仍然需要使用一些较旧的编译器(兼容c++03)来编译代码,因为支持的平台

回答 3 投票 0

shared_ptr 和 unique_ptr:关于具体案例的问题

我想定义两个类 A 和 I,使其对象尊重这种关系: i1 ------------a1 |------a2 |----a3 I 类的一个实例指向 0、1、...

回答 2 投票 0

多个shared_ptr指向同一个对象

出于学习目的,我现在正在编码二叉搜索树旋转。 我通常使用 std::unique_ptr 但这次我使用 std::shared_ptr 这可以正确工作: // 节点实现 模板<

回答 1 投票 0

是否需要通过引用传递智能指针对象?

假设我有一个类,其中包含一个智能指针作为其成员变量: B 级; A类{ 民众: A(const std::shared_ptr& b) : b_(b) {} // 选项1:通过引用传递 ...

回答 2 投票 0

如何将“this”指针与智能指针一起使用

我有一个静态函数,我传递一个碰撞器,另一个碰撞器是它本身。我之前使用的是常规指针,并将其更改为shared_ptr。我找不到解决方案来如何将其作为...

回答 1 投票 0

将 boost intrusive_ptr 与不同 const-ness 进行比较

我想将 boost::intrusive_ptr 实例与基础类型的不同 const 性进行比较,但不幸的是,如果您取消注释该行,它就无法从框中工作: #包括 我想将 boost::intrusive_ptr 实例与基础类型的不同常量进行比较,但不幸的是,如果您取消注释该行,则它不起作用: #include <boost/intrusive_ptr.hpp> #include <memory> struct S {}; void intrusive_ptr_release(const S*){} int main() { boost::intrusive_ptr<const S> boost_const_ptr; boost::intrusive_ptr<S> boost_ptr; // if(boost_const_ptr < boost_ptr) {} // <------ here const S* s_const_ptr; S* s_ptr; if(s_const_ptr < s_ptr) {} std::unique_ptr<const S> u_const_ptr; std::unique_ptr<S> u_ptr; if(u_const_ptr < u_ptr) {} } 错误将是: no match for 'operator<' (operand types are 'boost::intrusive_ptr<const S>' and 'boost::intrusive_ptr<S>') 我可以比较原始指针,甚至可以比较 std::unique_ptr,但不能比较 boost::intrusive_ptr。这是有原因的,还是只是疏忽? 一个可能的原因是,与 shared_ptr < would be impossible in general. Other smart pointer types don't have to deal with the possibility of heterogenous comparison1 具有相同的语义,但 shared_ptr、weak_ptr 和 intrusive_ptr 可以。 template<class T, class U> bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b) noexcept; 退货: 未指定的值使得 operator< 是严格的弱排序,如 C++ 标准的 [lib.alg.sorting] 部分所述; 在operator<、!(a < b) && !(b < a)定义的等价关系下,两个shared_ptr实例是等价的当且仅当它们 共有所有权或两者都是空的。 shared_ptr 可以通过比较引用计数的地址来做到这一点。 intrusive_ptr 不能这样做,因为它没有对引用计数的指针访问。 例如当您将 shared_ptr<Base> 与 shared_ptr<Derived> 进行比较时,它们可能共享同一对象的所有权,这对于 unique_ptr<Base> 和 unique_ptr<Derived> 来说是不可能的。

回答 1 投票 0

具有预定义最大使用次数的共享指针

有没有一种方法可以实现具有编译时已知的最大引用计数的共享指针(可能使用 unique_pointer)?我的情况是 max_ref_count = 2。 const auto p = std::make_shared&...

回答 1 投票 0

如何与盒装枚举进行模式匹配?

我有一个枚举,我必须在其中执行模式匹配。但由于我在堆栈内存有限的虚拟机上运行程序(< 4Kb ), i allocated the enum on the heap using Box. But while

回答 1 投票 0

C++ 原子为shared_ptr 实现正确的内存顺序和线程防护

学习 std::atomic 和 std::memory_order 后,我想尝试使用基于 Microsoft 博客的原子来编写线程安全的共享指针和weak_ptr实现:In...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.