标签: shared-ptr

C++ - 将引用传递给std :: shared_ptr或boost :: shared_ptr

如果我有一个需要使用a的函数shared_ptr,那么传递它的引用会不会更有效(所以为了避免复制shared_ptr对象)?有哪些可能的不良副作用?我设想了两种可能的情况:

1)在函数内部,复制由参数组成,如

ClassA::take_copy_of_sp(boost::shared_ptr<foo> &sp)  
{  
     ...  
     m_sp_member=sp; //This will copy the object, incrementing refcount  
     ...  
}  
Run Code Online (Sandbox Code Playgroud)

2)在函数内部仅使用参数,例如

Class::only_work_with_sp(boost::shared_ptr<foo> &sp) //Again, no copy here  
{    
    ...  
    sp->do_something();  
    ...  
}  
Run Code Online (Sandbox Code Playgroud)

我无法在两种情况下都看到传递boost::shared_ptr<foo>by值而不是引用的充分理由.按值传递只会"暂时"增加由于复制而引用的引用计数,然后在退出函数范围时减少它.我忽略了什么吗?

只是为了澄清,在阅读了几个答案之后:我完全赞同过早优化的问题,而且我总是试着先在热点上进行首次剖析.如果你知道我的意思,我的问题更多来自纯粹的技术代码观点.

c++ boost pass-by-reference pass-by-value shared-ptr

113
推荐指数
6
解决办法
5万
查看次数

`const shared_ptr <T>`和`shared_ptr <const T>`之间的区别?

我正在为C++中的共享指针编写一个访问器方法,如下所示:

class Foo {
public:
    return_type getBar() const {
        return m_bar;
    }

private:
    boost::shared_ptr<Bar> m_bar;
}
Run Code Online (Sandbox Code Playgroud)

因此,为了支持getBar()返回类型的常量应该是一个boost::shared_ptr阻止Bar它指向的修改.我的猜测shared_ptr<const Bar>我希望返回的类型,但是const shared_ptr<Bar>会阻止指针本身的重新分配指向不同Bar但允许修改Bar它指向的......但是,我不确定.我很感激,如果有人知道肯定可以证实这一点,或者如果我弄错了就纠正我.谢谢!

c++ boost const shared-ptr

104
推荐指数
1
解决办法
5万
查看次数

shared_ptr在哪里?

经过几个小时试图找到shared_ptr所在的位置后,我现在非常沮丧.我看到的所有示例都没有显示包含shared_ptr(和工作)标题的完整代码.只是陈述std,tr1<memory>没有任何帮助!我已经下载了增强功能,但仍然没有显示!有人可以通过告诉确切的位置来帮助我吗?

谢谢你让我发泄我的挫折!

编辑:我看到我的标题已被更改.对于那个很抱歉.所以...也是因为我不清楚shared_ptr是"C++版本依赖" - >这就是为什么我没有陈述我的环境 - >因此可能为什么我很难找到它.

我正在研究MSVS2008.

编辑2:我不知道为什么,但我在包括[memory]和[boost/tr1/memory.hpp]和[boost/tr1/tr1/memory],同时寻找shared_ptr的所有地方..当然,我不能"T.

感谢所有的回复.

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

102
推荐指数
3
解决办法
10万
查看次数

std :: shared_ptr线程安全解释

我正在阅读http://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.html,我仍然不清楚一些线程安全问题:

  1. 标准保证引用计数是处理线程安全的并且它是独立于平台的,对吧?
  2. 类似的问题 - 标准保证只有一个线程(持有最后一个引用)将在共享对象上调用delete,对吗?
  3. shared_ptr不保证存储在其中的对象的任何线程安全吗?

编辑:

伪代码:

// Thread I
shared_ptr<A> a (new A (1));

// Thread II
shared_ptr<A> b (a);

// Thread III
shared_ptr<A> c (a);

// Thread IV
shared_ptr<A> d (a);

d.reset (new A (10));
Run Code Online (Sandbox Code Playgroud)

在线程IV中调用reset()将删除在第一个线程中创建的A类的先前实例并将其替换为新实例?此外,在IV线程中调用reset()之后,其他线程只会看到新创建的对象?

c++ shared-ptr c++11

100
推荐指数
3
解决办法
6万
查看次数

我应该通过引用传递shared_ptr吗?

传递shared_ptr的最佳做法是什么?

目前我传递shared_ptr函数参数,如下所示:

void function1( shared_ptr<TYPE>& value );
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr

96
推荐指数
3
解决办法
8万
查看次数

为什么shared_ptr <void>合法,而unique_ptr <void>是不正确的?

问题确实符合标题:我很想知道这种差异的技术原因是什么,还有理由?

std::shared_ptr<void> sharedToVoid; // legal;
std::unique_ptr<void> uniqueToVoid; // ill-formed;
Run Code Online (Sandbox Code Playgroud)

c++ smart-pointers shared-ptr unique-ptr

89
推荐指数
2
解决办法
1万
查看次数

将共享指针作为参数传递

如果我声明一个包装在共享指针中的对象:

std::shared_ptr<myClass> myClassObject(new myClass());
Run Code Online (Sandbox Code Playgroud)

然后我想将它作为参数传递给方法:

DoSomething(myClassObject);

//the called method
void DoSomething(std::shared_ptr<myClass> arg1)
{
   arg1->someField = 4;
}
Run Code Online (Sandbox Code Playgroud)

以上只是增加了shared_pt的引用计数,一切都很酷吗?还是留下一个悬垂的指针?

你还是应该这样做吗?:

DoSomething(myClassObject.Get());

void DoSomething(std::shared_ptr<myClass>* arg1)
{
   (*arg1)->someField = 4;
}
Run Code Online (Sandbox Code Playgroud)

我认为第二种方式可能更有效,因为它只需要复制1个地址(而不是整个智能指针),但第一种方式似乎更具可读性,我不期望推动性能限制.我只是想确保没有危险的东西.

谢谢.

c++ c++-faq shared-ptr c++11

82
推荐指数
3
解决办法
5万
查看次数

std :: shared_ptr这个

我目前正在尝试学习如何使用智能指针.然而,在做一些实验时,我发现了以下情况,我无法找到一个令人满意的解决方案:

想象一下,你有一个A类的对象是B类对象(孩子)的父对象,但两者都应该互相认识:

class A;
class B;

class A
{
public:
    void addChild(std::shared_ptr<B> child)
    {
        children->push_back(child);

        // How to do pass the pointer correctly?
        // child->setParent(this);  // wrong
        //                  ^^^^
    }

private:        
    std::list<std::shared_ptr<B>> children;
};

class B
{
public:
    setParent(std::shared_ptr<A> parent)
    {
        this->parent = parent;
    };

private:
    std::shared_ptr<A> parent;
};
Run Code Online (Sandbox Code Playgroud)

问题是A类的一个对象如何std::shared_ptr将自身(this)传递给它的孩子?

有Boost共享指针(Get a boost::shared_ptrforthis)的解决方案,但是如何使用std::智能指针处理这个问题?

c++ this shared-ptr this-pointer

82
推荐指数
2
解决办法
5万
查看次数

使用shared_ptr的示例?

嗨,我今天问了一个问题,关于如何在同一个向量数组中插入不同类型的对象,我的代码就是那个问题

 gate* G[1000];
G[0] = new ANDgate() ;
G[1] = new ORgate;
//gate is a class inherited by ANDgate and ORgate classes
class gate
{
 .....
 ......
 virtual void Run()
   {   //A virtual function
   }
};
class ANDgate :public gate 
  {.....
   .......
   void Run()
   {
    //AND version of Run
   }  

};
 class ORgate :public gate 
  {.....
   .......
   void Run()
   {
    //OR version of Run
   }  

};      
//Running the simulator using overloading concept
 for(...;...;..)
 {
  G[i]->Run() ;  //will run …
Run Code Online (Sandbox Code Playgroud)

c++ boost smart-pointers vector shared-ptr

81
推荐指数
3
解决办法
16万
查看次数

C++ 11 unique_ptr和shared_ptr是否能够转换为彼此的类型?

难道C++ 11标准库提供任何实用程序从一个转换std::shared_ptrstd::unique_ptr,或反之亦然?这是安全的操作吗?

c++ shared-ptr unique-ptr c++11

79
推荐指数
1
解决办法
5万
查看次数