标签: shared-ptr

std :: tr1中的shared_ptr

我正在使用gcc编译器的平台上工作,但是boost无法在其上编译.

我想知道在gcc的std:tr1中包含shared_ptr的正确方法是什么?我查看的文件说不要直接包含它,我可以告诉其他任何文件都不包含它:|

c++ gcc boost tr1 shared-ptr

9
推荐指数
1
解决办法
8707
查看次数

shared_ptr和切片

我曾与之合作的人曾说过,shared_ptr是不安全的,并且会在从派生类转换为基类时进行切片(即向上转换).例如,如果有两个A和B类,其中B来自A,那么

shared_ptr<A> a(new B)
Run Code Online (Sandbox Code Playgroud)

会切片.我指着他http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm 在那里说

shared_ptr<T>可以隐式转换到shared_ptr<U>每当T*可以隐式转换到U*.

暗示在这些情况下使用是安全的,但他似乎并不这么认为.

c++ shared-ptr

9
推荐指数
1
解决办法
1206
查看次数

使用boost :: shared_ptr进行赋值的问题(与reset()函数相比)

很抱歉,如果在某处明确回答这个问题,但我对我在线阅读的文档和文章感到有些困惑.

我看到我可以使用reset()函数释放shared_ptr中的内存(假设引用计数变为零),例如,

shared_ptr<int> x(new int(0));
x.reset(new int(1));
Run Code Online (Sandbox Code Playgroud)

我相信这会导致创建两个整数对象,并且在这两行的末尾,将从内存中删除等于零的整数.

但是,如果我使用以下代码块怎么办:

shared_ptr<int> x(new int(0));
x = shared_ptr<int>(new int(1));
Run Code Online (Sandbox Code Playgroud)

显然,现在*x == 1是真的,但原始整数对象(等于零)是从内存中删除还是我泄漏了那个内存?

在我看来,这将是赋值运算符减少shared_ptr的引用计数的问题,但是对源代码的一瞥似乎并不能解决我的问题.希望有经验或知识渊博的人可以帮助我.提前致谢.

c++ boost shared-ptr

9
推荐指数
2
解决办法
7974
查看次数

enable_shared_from_this(c ++ 0x):我做错了什么?

我只是在即将推出的新c ++标准中使用智能指针.但是我没有掌握shared_from_this函数的用法.这是我有的:

#include <iostream>
#include <memory>

class CVerboseBornAndDie2 : public std::enable_shared_from_this<CVerboseBornAndDie2>
{
public:
    std::string m_Name;
    CVerboseBornAndDie2(std::string name) : m_Name(name)
    {
        std::cout << m_Name << " (" <<  this << ") is born!" << std::endl;
    }
    virtual ~CVerboseBornAndDie2()
    {
        std::cout << m_Name << " (" <<  this << ") is dying!" << std::endl;
    }
};

int main(){
    CVerboseBornAndDie2* vbad = new CVerboseBornAndDie2("foo");
    std::shared_ptr<CVerboseBornAndDie2> p = vbad->shared_from_this();
}
Run Code Online (Sandbox Code Playgroud)

它会在行中抛出一个std :: bad_weak_ptr异常

std::shared_ptr<CVerboseBornAndDie2> p = vbad->shared_from_this();
Run Code Online (Sandbox Code Playgroud)

如果我反而这样做

std::shared_ptr<CVerboseBornAndDie2> p(vbad);
Run Code Online (Sandbox Code Playgroud)

它有效,我可以事后做

std::shared_ptr<CVerboseBornAndDie2> p2 = …
Run Code Online (Sandbox Code Playgroud)

c++ smart-pointers shared-ptr c++11

9
推荐指数
2
解决办法
6100
查看次数

哪个在Visual C++ 2010上更快 - std :: shared_ptr或boost :: shared_ptr?

有没有人在发布模式版本中测试过这个?或者实现如此相似,没有显着差异?

我对速度感兴趣:

  1. 创建一个新的shared_ptr

  2. 创建shared_ptr的副本

  3. 取消引用指针以访问指针对象

这将是针对速度优化的发布版本,使用make_shared()创建新的shared_ptrs

c++ boost smart-pointers shared-ptr visual-c++

9
推荐指数
1
解决办法
1512
查看次数

使用boost :: enable_shared_from_this时出现不完整的类型错误

在以下行

class Symbol : public boost::enable_shared_from_this<Symbol> {

我收到错误:

错误:无效使用不完整类型struct boost::enable_shared_from_this<Symbol> /usr/include/boost/smart_ptr/shared_ptr.hpp:63:错误:声明struct boost::enable_shared_from_this<Symbol>

知道为什么我会收到这个错误.符号是一个抽象类(如果重要的话)

c++ shared-ptr

9
推荐指数
1
解决办法
3343
查看次数

x86/C++ - 指针指针:编译器违反了const?

我正在为我的学生项目的游戏引擎开发一个共享指针(称为Handle)实现,我们遇到了一个我们无法解释的错误.出于某种原因,在我们工厂的某个点上,有一个无效的内部指针通过句柄传递给工厂,这在我们的原型加载过程中导致了崩溃.我们通过这个过程进行了几个小时的调试,并将任何复杂的语句分解为最简单的版本,以便于调试.我终于将问题分解为Handle类的复制构造函数.但是,似乎还有一些中间步骤,其中内部指针被释放.我阅读了有关可能导致此问题的所有文章,但没有找到任何内容.最后,我决定查看反汇编,看看能否弄清楚发生了什么.这是没有反汇编的复制构造函数.

template <class TYPE>
Handle<TYPE>::Handle(const Handle<TYPE>& rhs, bool weak) : m_weak(weak), m_ref_count(rhs.m_ref_count), m_ptr(rhs.m_ptr)
{
  if(!m_weak)
    ++(*m_ref_count);
}
Run Code Online (Sandbox Code Playgroud)

这是带有反汇编的复制构造函数.

template <class TYPE>
Handle<TYPE>::Handle(const Handle<TYPE>& rhs, bool weak) : m_weak(weak), m_ref_count(rhs.m_ref_count), m_ptr(rhs.m_ptr)
{
013FFF50 push         ebp
013FFF51 mov          ebp,esp
013FFF53 sub          esp,0CCh
013FFF59 push         ebx
013FFF5A push         esi
013FFF5B  push        edi  
013FFF5C  push        ecx  
013FFF5D  lea         edi,[ebp-0CCh]  
013FFF63  mov         ecx,33h  
013FFF68  mov         eax,0CCCCCCCCh  
013FFF6D  rep stos    dword ptr es:[edi]  
013FFF6F  pop         ecx  
013FFF70  mov         dword ptr [this],ecx  
013FFF73  mov         eax,dword ptr [this] …
Run Code Online (Sandbox Code Playgroud)

c++ x86 shared-ptr visual-studio-2013

9
推荐指数
1
解决办法
230
查看次数

如何在构造函数的初始化列表中初始化共享指针?

如何在构造函数的初始化列表中初始化共享指针?

我有这个:

Foo::Foo (const callback &cb)
{
    Bar bar;
    bar.m_callback = cb;
    m_ptr = std::make_shared<Bar>(bar);

    //...
}
Run Code Online (Sandbox Code Playgroud)

我想把它放到构造函数的初始化列表中.就像是:

Foo::Foo (const callback &cb) :
   m_ptr(std::make_shared<Bar>(?????))
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

酒吧是struct:

struct Bar
{
  callback_type m_callback;
  // etc.
};
Run Code Online (Sandbox Code Playgroud)

c++ constructor shared-ptr c++11

9
推荐指数
1
解决办法
7591
查看次数

为什么allocate_shared和make_shared这么慢

我刚刚编写了一个测试程序,以找到分配和释放许多管理对象的最快方法shared_ptr.

我试图shared_ptrnew,shared_ptrpool,make_shared,allocate_shared.是什么让我感到惊讶的allocate_shared是慢shared_ptrpool.

vs2017+win10用发布版本测试代码.发布版本设置为默认值(/ O2).我也测试它gcc4.8.5+centos6.2g++ -std=c++11 -O3.

代码是:

#include <memory>
#include <iostream>
#include <vector>
#include <assert.h>
#include <chrono>
#include <mutex>
using namespace std;

struct noncopyable {
protected:
    noncopyable() = default;
    ~noncopyable() = default;
private:
    noncopyable(const noncopyable&) = delete;
    noncopyable& operator=(const noncopyable&) = delete;
    noncopyable(noncopyable&&) = delete;
    noncopyable& operator=(noncopyable&&) = delete;
};

class BlockPool : noncopyable …
Run Code Online (Sandbox Code Playgroud)

c++ performance shared-ptr c++11

9
推荐指数
1
解决办法
713
查看次数

将 std::shared_ptr&lt;T&gt; 传递给采用 std::shared_ptr&lt;const T&gt; 的函数?

我有一个函数需要共享一个参数的所有权,但不修改它。我已将参数设为 shared_ptr<const T> 以清楚地传达此意图。

template <typename T>
void func(std::shared_ptr<const T> ptr){}
Run Code Online (Sandbox Code Playgroud)

我想将此函数与 shared_ptr 调用到非常量 T。例如:

auto nonConstInt = std::make_shared<int>();
func(nonConstInt);
Run Code Online (Sandbox Code Playgroud)

但是,这会在 VC 2017 上生成编译错误:

error C2672: 'func': no matching overloaded function found
error C2784: 'void func(std::shared_ptr<const _Ty>)': could not deduce template argument for 'std::shared_ptr<const _Ty>' from 'std::shared_ptr<int>'
note: see declaration of 'func'
Run Code Online (Sandbox Code Playgroud)

有没有办法让这项工作没有:

  • 修改对 func 的调用。这是更大的代码重构的一部分,我不想在每个调用站点都使用 std::const_pointer_cast 。
  • 定义 func 的多个重载,因为这似乎是多余的。

我们目前正在根据 C++14 标准进行编译,如果有帮助,我们计划很快迁移到 C++17。

c++ shared-ptr c++11 c++14

9
推荐指数
2
解决办法
379
查看次数