this* 在 make_unique 中的用法
我有一个Factory设计模式的小例子,我对此很感兴趣: std::make_unique(*this) ...尤其是*this. 这是否意味着clone()方法返回std::unique_ptr指向工厂类的成员? createInstance()总是返回Factory类的同一成员? 我只是感到困惑,因为std::make_unique(*this) A在构造函数std::string中,而不是指向自身的指针. class Base { public: virtual ~Base() {} virtual std::unique_ptr clone() = 0; virtual void print() = 0; }; class A: public Base { std::string name_; public: A(std::
28 2024-04-22
编程技术问答社区
堆栈分配变量的智能指针--unique_ptr
我有以下简单的代码,我还没有找到一个线程,该线程用于此简单情况,而是复制对象: int main() { int i = 1; std::unique_ptr p1(&i); *p1 = 2; return 0; } 当指针脱离范围时,这会导致_BLOCK_TYPE_IS_INVALID.如果我调用p1.release(),则代码可以正常工作,并且我不会遇到此错误.我以为这样的指针足够聪明,可以处理悬空的指针? 替代方案是如果我有i副本,这不会给出上述错误: std::unique_ptr p1(new int(i)); 在这里使用智能指针的优点是什么,我不想执行本地副本? 如果我要使用原始指针: int i = 1; int *p1 = &i; *p1 = 2; 即使我不编码,我也不会遇到错误: p1 = nullptr; 解决方案 std::unique_ptr s用于动态分
12 2024-04-22
编程技术问答社区
我应该赋值还是重置 unique_ptr?
鉴于常见的情况是,拥有的对象的寿命与其所有者链接在一起,我可以使用一种独特的指针之一. . 可以分配: class owner { std::unique_ptr owned; public: owner() { owned=std::unique_ptr(new someObject()); } }; 可以使用重置方法: class owner { std::unique_ptr owned; public: owner() { owned.reset(new someObject()); } }; 为了最佳实践的利益,我应该宁愿一种形式而不是另一种形式吗? 编辑:对不起.我过度简化了.堆分配以初始方法而不是在CTOR中发生.因此,我不能使用启动器列表.
20 2024-04-22
编程技术问答社区
在不转移所有权的情况下返回 unique_ptr 私有成员数据
上下文 下面的错误似乎在告诉我我无法从此获取函数中返回m_head m_head.我只想在不转移所有权的情况下退还我的unique_ptr m_head. 从那以后,我一直完全避免将原始指针引入智能指针,因为原始指针并不例外安全,让内存管理开销和我所知道的其他问题.也许有些情况下,我应该在小范围中简要使用它们? 在这种情况下,我认为我需要转移所有权而不是当前的方法.相反,我应该通过unique_ptr管理对象,创建一个新的shared_ptr来管理对象,然后返回shared_ptr,但需要一些确认.我认为可能是这种情况,因为 unique_ptr对象拥有其指针的独特性:没有其他设施 照顾删除对象,因此没有其他托管指针 应该指向其托管对象,因为 unique_ptr对象删除其托管对象而无需进入 说明其他指针是否仍然指向相同的对象, ,因此留下了任何其他指向指向的指针 位置无效. 错误 `function "std::unique_ptr
6 2024-04-22
编程技术问答社区
使用 std::vector 指针时,将 c++98 代码转换为新的 c++17 代码
我不管理什么或以下什么,因为我可以管理原始指针在示例中要删除对象,然后再将其从向量删除,我想在此处避免使用它 将此代码转换为使用unique_ptr或shared_ptr 的好情况是什么. class GameState { public: virtual bool onEnter() = 0; virtual bool onExit() = 0; virtual std::string getStateID() const = 0; }; class MenuState : GameState { public: MenuState(){}; virtual ~MenuState(){}; bool onEnter(){}; bool onExit(){};
20 2024-04-22
编程技术问答社区
带有 shared_ptr 和 unique_ptr 的不完整类型
我想理解为什么unique_ptr破坏者需要在破坏时完成类型,而shared_ptr则不是这种情况. 霍华德·辛南特(Howard Hinnant)的这个博客简短地提到了它与静态和动态删除器有关.我正在寻找有关为什么可能是这种情况的更详细的解释(可能是编译器实施特定的,在这种情况下,一个示例将很有帮助).使用动态删除器,它是否限制了驱动器被绑定? 解决方案 霍华德·辛南特(Howard Hinnant)正在简化.他确切地说,如果您将默认的deleter用于std::unique_ptr,则需要完整的类型.对于默认的deleter,它只是为您调用delete. 静态和动态删除器的要旨是 class A; void static_delete(A* p) { delete p; } void (*dynamic_delete)(A*) = /* somehow */; int main() { A* p = /* somehow */; st
28 2024-04-22
编程技术问答社区
在boost中使用unique_ptr python-boost::shared_ptr可以工作,但unique_ptr不能。
这可能与 相同 boost python no to_python for std :: simelor_ptr 但是,我还没有看到响应,目前尚不清楚这是" boost-python"问题,还是由于我对'std :: simelor_ptr'的特殊使用而造成的 我试图弄清为什么使用" std :: std :: solution_ptr []" 时,为什么要更改从boost :: shared_ptr中断汇编的类 以下是我的Boost Python模块,其中有2个可能的" Smart_Array"类 原件基于boost :: shared_array且工作正常(如下显示) 当我基于unique_ptr(简单替换)使用一个时,我会感到混乱的编译错误. // Boost Includes ============================================================== #include
8 2024-04-02
编程技术问答社区
Boost.Python。如何暴露std::unique_ptr
我是Boost.python的新手 功能签名看起来像这样: std::unique_ptr someFunc(const std::string &str) const; 在Python中调用该功能时,我会收到以下错误: TypeError: No to_python (by-value) converter found for C++ type: std::unique_ptr > 我在python中的功能呼叫看起来像这样: a = mymodule.MyClass() a.someFunc("some string here") # error here 我试图揭露std :: unique_ptr,但不能使它起作用. 有人知道如何正确地揭露指针班吗? 谢谢! 编辑: 我尝试了以下内容: class_
30 2024-04-02
编程技术问答社区
使用boost::serialization对std::vector of unique_ptr进行序列化,在linux上失败。
我遇到了使用sTD :: vector的boost序列化std :: simel_ptr的序列化的问题. unique_ptr的类型无关紧要,在以下示例中,使用整数: #include #include #include #include #include namespace boost { namespace serialization { template void serialize(Archive& ar, std::vector>& g, const unsigned int version) { ar&
8 2024-04-02
编程技术问答社区
提升线程组将unique_ptr的所有权转移给线程
有哪些解决方法可以使此代码运行?该代码导致"试图引用已删除函数". unique_ptr被分配为循环,然后传递到线程,然后摆脱. boost::thread_group threads; std::unique_ptr scenario_result; while ((scenario_result = scenarioStock.getNextScenario()) != nullptr) { threads.create_thread(boost::bind(&Simulation::RunSimulation, boost::ref(grid_sim), std::move(scenario_result))); } 解决方案 您可以使用lambda表达式而不是boost::bind threads.create_thread([&] { grid_sim.RunSimulation(std::move(scenario_resu
10 2024-04-02
编程技术问答社区
当你想实现一个可以返回 "无 "的函数时,何时使用boost::option,何时使用std::unique_ptr?
据我了解,有两种方法可以实现有时不会返回结果的函数(例如,在ppl列表中发现的人). * - 我们忽略了RAW PTR版本,与Bool Flag配对,当没有找到版本时异常. boost::optional findPersonInList(); 或 std::unique_ptr findPersonInList(); 所以有任何理由优先于另一个吗? 解决方案 这取决于:您是否希望返回 handle 或a copy . 如果您想返回 hander : Person* boost::optional 都是可接受的选择.我倾向于使用Ptr类,以便在无效访问时投掷,但这是我的偏执狂. 如果您想返回复制: boost::optional对于非多态类别 std::unique_ptr对于多态类别 因为动态分配会产生开销,因此您仅
8 2024-04-02
编程技术问答社区
如何用unique_ptr执行dynamic_cast?
我的类层次结构如下: class BaseSession : public boost::enable_shared_from_this class DerivedSessionA : public BaseSession class DerivedSessionB : public BaseSession 在派生的类函数中,我经常调用这样的函数: Func(boost::dynamic_pointer_cast(shared_from_this())); 由于我正在与shared_ptr一起管理会议,因此工作正常.最近,我发现我对shared_ptr的使用并不是最佳的.那是因为这些会话是每个客户端维持一个插座的单例对象.如果重新连接了插座,则会副本用于僵尸. 作为解决方法,我开始通过参考而不是副本传递shared_ptr.这解决了僵尸问题. 理想情况下,我觉得我应该使用unique_ptr存储会
18 2024-04-02
编程技术问答社区
unique_ptr boost等同于?
在Boost库中,C ++ 1X的std :: unique_ptr是否有等​​效类?我要寻找的行为是能够具有异常安全的工厂功能,例如So ... std::unique_ptr create_base() { return std::unique_ptr(new Derived); } void some_other_function() { std::unique_ptr b = create_base(); // Do some stuff with b that may or may not throw an exception... // Now b is destructed automagically. } 编辑:现在,我正在使用此黑客,这似乎是我目前能得到的最好的... Base* create_base() { return new Derived; } void som
8 2024-04-01
编程技术问答社区
在BST中使用unique_ptr而不是shared_ptr
我试图用unique_ptr实现BST.我有一个用于shared_ptr的工作程序.我该如何使用unique_ptr代替二进制搜索者的单个所有权语义? 当我用shared_ptr替换shared_ptr时,我的汇编错误超出了理解. #include #include template class BinarySearchTree{ struct TreeNode; typedef std::shared_ptr spTreeNode; struct TreeNode{ T data; spTreeNode left; spTreeNode right; TreeNode(const T & value):data(value),left(nullptr),right(nullptr){} };
18 2024-03-30
编程技术问答社区
为什么T*可以在寄存器中传递,而unique_ptr<T>不能?
我正在观看Chandler Carruth在CPPCON 2019中的演讲: 没有零cost摘要 在其中,他给出了一个例子,说明了他如何通过在int*上使用std::unique_ptr所产生的费用感到惊讶;该部分在时间点17:25开始. 您可以查看汇编结果他的示例fair-snippets(Godbolt) org) - 实际上,编译器似乎不愿意通过唯一的_ptr值 - 实际上,在底线中,这只是一个地址 - 仅在寄存器内,仅在直线内存中. Carruth先生在27:00左右提出的要点之一是,C ++ ABI需要副价值参数(有些但不是全部;也许 - 非重要性类型?非易于构造的类型?)内存,而不是在寄存器中. 我的问题: 这实际上是某些平台上的ABI要求吗? (哪个?)或者在某些情况下只是一些悲观? 为什么ABI会这样?也就是说,如果结构/类的字段适合寄存器,甚至是单个寄存器 - 为什么我们不能在该寄存器中传递它? C ++标准委员会近年来
10 2024-03-16
编程技术问答社区
C++ unique_ptr和数组
我试图将数组与unique_ptr没有成功. 声明某个大小的唯一_ptr的正确方法是什么? (大小是某个参数). unique_ptr ptr = make_unique(size); 这是一个示例: #include #include #include #include #include using namespace std; class A { string str; public: A(string _str): str(_str) {} string getStr() { return str; } }; int main() { unique_ptr ptr = make_unique(3); } 但是,如果我删除了a的构造函数,则可以工作.
16 2024-03-06
编程技术问答社区
C++数组和make_unique
作为 this post我想知道它的实施 >播放具有分配函数 - 播种缓冲区数组,例如在以下代码中. f() { auto buf = new int[n]; // temporary buffer // use buf ... delete [] buf; } 可以用一些呼叫make_unique替换,并且会使用[] - delete的version? 解决方案 这是另一个解决方案(除了Mike之外): #include #include #include template typename std::enable_if ::value, std::unique_ptr >::type make_unique(Args&& ...args) { return std:
10 2024-03-05
编程技术问答社区
如何获得存储在unique_ptr中的数组大小?
如果我这样做: std::unique_ptr uparr(new int[1984]); 我将uparr传递给某人而不将1984传递给他们,他们可以看到它有多少元素吗? aka对于数组的unique_ptr,是否有相当于vector的.size()? 解决方案 不,没有.动态阵列是一种有缺陷的语言功能.本质上,您总是需要/需要单独传递数组长度(除非您有某种哨兵策略).因此,您不妨使用std::vector(如果您不介意额外的词来满足容量). 其他解决方案 否,信息丢失了. 如果您需要跟踪它,请改用矢量,或者您真的不想要额外的服务,请在分配的数组周围写一个小包装器.例如,您可以查看被启动C ++ 1Y标准的建议. 其他解决方案 unique_ptr不携带尺寸信息.您可以使用vector,但是有两个问题: 大小不是固定的.有时这是一个重要的财产. 即使您不想,也要迫使每个元素. 您可以用大小包装unique_ptr制作自
18 2024-03-05
编程技术问答社区
为什么unique_ptr会重载reset(pointer p = pointer())和reset(nullptr_t)?
内存/unique_ptr/reset , void reset( pointer ptr = pointer() ); template void reset( U ) = delete; void reset( std::nullptr_t p ); 1)给定current_ptr,由*this管理的指针执行 按以下顺序采取以下操作: 保存当前指针old_ptr = current_ptr的副本; 用参数current_ptr = ptr覆盖当前的指针; 如果旧的指针是非空的,请删除先前管理的对象if(old_ptr != nullptr) get_deleter()(old_ptr). 2)在动态阵列的专业化中,std::unique_ptr, 提供此模板成员以防止使用reset() 派生的指针(这将导致不确定的行为 数组). 3)在动态阵列的专业中,std::unique_ptr 必须重置第三个超负荷以允许重置
12 2024-03-05
编程技术问答社区