草庐IT

c++ - 从 shared_ptr 中分离一个指针?

这个问题在这里已经有了答案:关闭10年前.PossibleDuplicate:Howtoreleasepointerfromboost::shared_ptr?我的接口(interface)的一个函数返回一个指向对象的指针。用户应该拥有该对象的所有权。我不想返回Boost.shared_ptr,因为我不想强制客户使用boost。但是,在内部,我想将指针存储在shared_ptr中,以防止出现异常等情况下的内存泄漏。似乎没有办法将指针与共享指针分离。这里有什么想法吗? 最佳答案 您正在寻找的是release函数;shared_ptr没

c++ - 为什么不推荐使用 std::shared_ptr::unique() ?

std::shared_ptr::unique()的技术问题是什么导致它在C++17中被弃用?根据cppreference.com,std::shared_ptr::unique()在C++17中被弃用为thisfunctionisdeprecatedasofC++17becauseuse_countisonlyanapproximationinmulti-threadedenvironment.我理解这对于use_count()>1是正确的:当我持有对它的引用时,其他人可能同时放开他的引用或创建一个新拷贝。但如果use_count()返回1(这是我在调用unique()时感兴趣的内容

c++ - unique_ptr<T> 用于数组特化的 lambda 自定义删除器

这个问题在这里已经有了答案:HowdoIuseacustomdeleterwithastd::unique_ptrmember?(10个回答)关闭4年前.我最近开始将大量现有C++应用程序代码移植到C++11,现在我正在转换为新的智能指针std::unique_ptr和std::shared_ptr,我有一个关于自定义删除器的具体问题。我想添加一个lambda记录器来查看我的删除被调用的位置,但我无法获得要编译的数组特化版本。非常感谢您的建议。我一直在寻找用于VC++10或GCC4.5.2+unique_ptr的数组特化自定义删除器的示例,但未果。强>。我想在lambda中调用删除器时

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

好的,首先是一些可能相关的事情:我在C++11模式下使用Clang3.1编译器,标准库设置为libc++。我正在尝试让自己熟悉C++11,但在这样做的过程中,我遇到了一些看起来很奇怪的行为。这可能是Clang或libc++的一个怪癖,但我不会说C++标准语言,而且我无法访问其他支持C++11的编译器,所以我无法真正检查它,我已经搜索了互联网和StackOverflow尽我所能,没有找到任何相关的东西......所以我们开始吧:当使用shared_ptr/unique_ptr为简单资源实现RAII时,它们的行为似乎在删除空指针时有所不同。我意识到通常没有必要删除空指针,但我曾期望该行为至

c++ - std::shared_ptr 异常安全

我刚刚意识到阅读thispagestd::shared_ptr的构造函数只有一个指针参数不是noexcept。因此以下代码包含可能的内存泄漏:std::shared_ptrp3(newint);原因是可能发生两次分配:调用构造函数之前的第一个shared_ptr构造函数中的第二个(这就是在VS2012中发生的情况)这里有两个问题:如果第二次分配抛出异常,是不是第一次的内存泄漏?如果答案是肯定的:使用std::shared_ptr的正确习惯用法是什么?使用make_shared将第一次分配的所有权授予std::unique_ptr然后转移所有权其他想法? 最佳

c++ - 使用 old_pointer + offset 的 new_pointer 设置 shared_ptr

这是一个智能指针:std::shared_ptrp(newchar[size])它表示填充了原始二进制文件内容的数组。在(并且仅在之后)整个数组从文件复制到RAM之后,我可以解析它,并在此期间检索一些标题信息(一些第一个dwords)。然后是实际数据。在不提供更多上下文的情况下,将提到的共享指针设置为实际数据开头的新地址对我来说很方便。此地址仍在分配的内存中。但是如何设置才不会丢失呢?一个问题是(是/否):是否可以设置p在不调用数据删除的情况下偏移前一个指针? 最佳答案 是的,这是可能的。您可以使用构造函数8,此引用中的别名构造函数

c++ - std::mem_fun 与 std::mem_fn

std::mem_fun和std::mem_fn有什么区别?为什么命名如此困惑?Boost的documentation说std::mem_fn在大多数情况下可以替换std::mem_fun。那么在什么情况下你还会使用std::mem_fun? 最佳答案 std::mem_fun已弃用。std::mem_fn可以做它所做的一切,而且做起来更方便。两者的关系与std::bind1st的关系相同。/std::bind2nd和C++11std::bind.两个std::mem_fn和std::bind在std::bind1st之后开发和掌握

c++ - "fun"和 "&fun"之间的类型差异?

表达式fun和&fun的类型是否相同?考虑以下代码:templatevoidcheck(T){static_assert(is_same::value);}voidfun(){}check(fun);check(&fun);cout两个断言都成功,这表明两个表达式具有相同的类型。但是,typeid会返回不同的结果:FvvEPFvvE这是为什么呢? 最佳答案 两个断言都成功了,因为它们应用于从函数参数推导出的类型T。在这两种情况下,它都会被推断为指向函数的指针,因为函数会衰减为指向函数的指针。但是,如果您重写断言以直接接受类型,那么第

c++ - std::unique_ptr 的推荐用法

这个问题在这里已经有了答案:WhatisasmartpointerandwhenshouldIuseone?(14个回答)WhichkindofpointerdoIusewhen?(4个回答)关闭9年前。std::unique_ptr的推荐用途是什么?我发现:Aboutunique_ptrperformances我已经知道了:std::unique_ptr是在C++11中开发的,作为std::auto_ptr的替代品std::unique_ptr没有引用计数并且“拥有”它指向的对象没有std::unique_ptr的复制/分配当我需要一个唯一指针时,std::unique_ptr是转到

c++ - 为什么 std::weak_ptr::expired 被优化掉了?

在下面的代码中,while(!Ref.expired());被愉快地优化为无限循环。如果代码行改为while(!Ref.lock());。一切都按预期工作。所以真的有两个问题:1)当std::weak_ptr::expired()访问内存隔离计数器时,编译器如何优化过期?2)Ref.lock()真的安全吗,或者这也可以优化掉?下面的示例代码。#include#include#include#includeclassA{public:A(){m_SomePtr=std::make_shared(false);}virtual~A(){std::weak_ptrRef=m_SomePtr;