标签: shared-ptr

typedef'ing共享指针的最佳策略是什么?

我有一个关于使用typedef进行冗长模板的快速问题.关键点:我发现自己处于一种腌制状态 - 似乎没有一个将typedef放在除客户端函数本地之外的好地方.虽然有类似的SO问题(例如参见这里),但似乎没有人能够解决这个问题.请注意,这个问题并没有解决下面的typedef是否可取的问题 - 我试图简化出于说明目的.

与我一起工作时出现了我的问题boost::shared_ptr<T>.基本上,我想做以下事情:

#include <boost/shared_ptr.hpp>
typedef boost::shared_ptr<Widget> WidgetPtr;
Run Code Online (Sandbox Code Playgroud)

将此typedef放在Widget声明头中似乎很难看.这里似乎有两个注意事项:(i)如果Widget它本身没有在其成员中使用共享指针,我们添加了一个额外的include(因为我们无法转发声明boost::shared_ptr模板类 - 如果我是正确的我错误?)(ii)如果我们想在声明另一个类(称为该类Foo)期间使用此typedef,我们通过包括Widget.h而不是简单地向前声明Widget或包括WidgetFwd.h...... 来违反最佳实践...除非后者重复此类型的def .此外,boost::shared_ptr<Widget>在声明Widget自己的过程中输入deff似乎没有意义- 我们似乎在混合Widget声明,期待客户如何利用Widget 接口.

好吧,所以这很糟糕,但这更糟糕:如果我不尝试上面的某些组合,我最终会在客户端代码中出现重复的typedef,这会产生不一致(因此,可能是错误) - 整个点就是给定的Widget,WidgetPtrtypedef本身应该作为一种类型.示例:我们不想Foo使用WidgetPtr一个typedef boost::shared_ptr,而Bar使用WidgetPtr作为typedef std::auto_ptr.

另一种方法(以及我在网上讨论中提到的少数几种方法之一)是将typedef作为公共成员,Widget然后使用Widget::Ptr:

class Widget {
// ...
public:
     typedef boost::shared_ptr<Widget> Ptr;
};
Run Code Online (Sandbox Code Playgroud)

同样,我不喜欢这个,因为(i)它表明指针类型在某种程度上是类的成员,并且(ii)它导致一个不稳定的接口.更糟糕的是:因为我编写的每个类都可能指向使用智能指针,我最终会追逐想象中的客户端尾部.丑陋,丑陋,丑陋.

就目前而言,我已经从这个代码库中删除了typedef(因为它们导致严重的混淆,重复)并在选定的函数中重新引入它们.这里再次出现了使用不一致的问题,但并不是那么严重.

我能想到的唯一其他解决方案 …

c++ boost typedef shared-ptr

20
推荐指数
3
解决办法
4776
查看次数

std :: shared_ptr中的最大引用计数是多少?如果你试图超过它会发生什么?

如果我们假设std::shared_ptr存储引用计数(我意识到标准不需要,但我不知道任何没有的实现),那个引用计数具有有限的位数,这意味着存在最大数量的支持的引用.这导致了两个问题:

  • 这个最大值是多少?
  • 如果你试图超过它会发生什么(例如,通过复制引用具有最大引用计数的对象的std :: shared_ptr)?请注意,std::shared_ptr声明了复制构造函数noexcept.

该标准是否对这两个问题都有所了解?常见的实现如何,例如gcc,MSVC,Boost?

c++ reference-counting shared-ptr c++11

20
推荐指数
3
解决办法
3847
查看次数

返回shared_ptr时如何完成协变返回类型?

using namespace boost;

class A {};
class B : public A {};

class X {
  virtual shared_ptr<A> foo();
};

class Y : public X {
  virtual shared_ptr<B> foo();
};
Run Code Online (Sandbox Code Playgroud)

返回类型不是协变的(因此它们也不合法),但如果我使用的是原始指针,它们就会出现.如果有的话,解决这个问题的普遍接受的习惯是什么?

c++ boost return-value covariance shared-ptr

19
推荐指数
1
解决办法
2346
查看次数

enable_shared_from_this - 空内部弱指针?

我正在使用enable_shared_from_this<Base>然后继承Base.当尝试使用shared_from_this()in Derived的构造函数(而不是初始化列表)时,我得到一个异常.事实证明,内部弱指针为空并且根本不指向this.怎么会发生这种情况?我的其他用例完全正常.我甚至不知道从哪里开始.我低头看了源代码enable_shared_from_this,它看起来像指针永远是nullptr.

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

19
推荐指数
2
解决办法
7417
查看次数

删除指向不完整类型和智能指针的指针

当尝试使用auto_ptr带有forward-declaration声明的类型时,如下所示:

class A;
...
std::auto_ptr<A> a;
Run Code Online (Sandbox Code Playgroud)

A没有调用析构函数(显然,因为auto_ptr内部delete的底层指针和不完整类型的析构函数不能被调用).

但是,相同的代码工作正常,并在使用时调用析构函数std::shared_ptr而不是std::auto_ptr.怎么解释?

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

19
推荐指数
1
解决办法
6018
查看次数

make_shared和emplace函数

我试图找到一些简单的方法来安置元素,std::vector<std::shared_ptr<int>>但不能带来任何东西.std::shared_ptr将指针作为参数,所以我仍然可以这样写:

std::vector<std::shared_ptr<int>> vec;
vec.emplace_back(new int(10));
Run Code Online (Sandbox Code Playgroud)

但是,new如果可能的话,我不想手工使用,如果可能的话,我宁愿使用std::make_shared.问题是,如果我真的想要使用它,我必须使用它push_back而失去就地构造的优势:

std::vector<std::shared_ptr<int>> vec;
vec.push_back(std::make_shared<int>(10));
Run Code Online (Sandbox Code Playgroud)

有没有什么办法让两者的优点emplace_backstd::make_shared?如果没有,在这种情况下是否应该遵循指引?

编辑:实际上,我问了这个问题,但有一个无关的问题.Andy的答案是好的,并且使用这两个emplace函数并没有任何实际问题std::make_shared.

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

19
推荐指数
1
解决办法
5857
查看次数

用gdb检查boost shared_ptr

以下是我的源代码:

#include <iostream>
#include <boost/shared_ptr.hpp>

class MyClass
{
    public:
        MyClass()
        {
            i=10;
        }
    private:
        int i;
};


int main(int argc, const char *argv[])
{
    boost::shared_ptr <MyClass> obj(new MyClass());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想检查gdb中的obj,并查看成员变量i的值.

这是我用普通打印得到的:

29          boost::shared_ptr <MyClass> obj(new MyClass());
(gdb) n
30          return 0;
(gdb) p obj
$1 = {px = 0x602010, pn = {pi_ = 0x602030}}
Run Code Online (Sandbox Code Playgroud)

我尝试了此链接中提到的提示,但无法正常工作.

(gdb) call (obj.get())->print()
Cannot evaluate function -- may be inlined
Run Code Online (Sandbox Code Playgroud)

还有其他方法吗?gdb版本是7.0.1.

c++ boost gdb shared-ptr

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

可以从'enable_shared_from_this'派生一个类来提高性能吗?

make_shared比单独主叫更好的性能new和创建shared_ptr因为make_shared分配用于在相同的存储块作为客户端对象实例(有效地赋予的引用计数和弱计数空间shared_ptr的大部分的性能优势intrusive_ptr).

enable_shared_from_this给出一个共享指针,而不引用任何共享指针.因此,必须以某种方式从客户端对象内部访问诸如引用和弱计数之类的内容.因此,enable_shared_from_this引起类似的侵入性计数是明智的make_shared.

但是,我不知道这样的事情是如何实现的(我不确定即使我查看实际来源,我也会按照那里发生的事情).

那么(出于性能原因)标记我的类enable_shared_from_this是否有意义,如果我知道它只会被用作a shared_ptr而不是作为原始对象?

c++ performance shared-ptr c++11

18
推荐指数
1
解决办法
1917
查看次数

C++ std :: shared_ptr用法和信息

我想std::shared_ptr在我的代码中使用.我已经看到有关于这个问题的其他问题,但我仍然遇到编译器错误.我有正确版本的gcc和设置吗?

我做了什么:

我曾试图单独编译我既头码- <memory><tr1/memory>,但仍然在这两种情况下得到下面的错误.

我正在使用的gcc版本是

gcc --version
gcc (GCC) 4.3.2
Run Code Online (Sandbox Code Playgroud)

当我包含<memory>标题我使用std::shared_ptr和我使用的<tr1/memory>标题std::tr1::shared_ptr?它是否正确?

我已经设置了shared_ptr,如下所示:

std::shared_ptr<A*> ptr_A = shared_ptr( new A() );
Run Code Online (Sandbox Code Playgroud)

我得到的错误如下:

src/WH.cxx:156: error: 'shared_ptr' is not a member of 'std'
src/WH.cxx:162: error: 'shared_ptr' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

当我尝试<tr1/memory>标题时

src/WH.cxx:156: error: 'std::tr1' has not been declared
src/WH.cxx:162: error: 'shared_ptr' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

看起来我没有正确包含一些东西.有任何想法吗?

我知道boost库有,shared_ptr但这些库目前不适合我.

编辑:只是添加,我的编译器选项如下:g ++ -O3 -g3 -m32 -fPIC …

c++ g++ shared-ptr

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

weak_ptr,make_shared和内存释放

a的控制块shared_ptr保持活动,同时存在至少一个weak_ptr存在.如果创建共享指针make_shared,则意味着保持分配对象的整个内存.(对象本身被正确销毁,但由于控件块和对象的内存分配在一个块make_shared中,因此它们只能一起解除分配.)

我的理解是否正确?

看起来这种行为代表了一个问题,例如在着名的"缓存示例"中.对象的内存将永远分配.

这在任何实际情况下都是一个问题吗?应该shared_ptr在这种情况下使用构造函数创建(大对象和意图使用weak_ptrs)?

c++ shared-ptr weak-ptr make-shared c++11

18
推荐指数
1
解决办法
1685
查看次数