我不确定初始化是类的成员的shared_ptr的好方法。 你能告诉我,在C::foo()select的方式是好还是有更好的解决scheme? class A { public: A(); }; class B { public: B(A* pa); }; class C { boost::shared_ptr<A> mA; boost::shared_ptr<B> mB; void foo(); }; void C::foo() { A* pa = new A; mA = boost::shared_ptr<A>(pa); B* pB = new B(pa); mB = boost::shared_ptr<B>(pb); }
boost :: shared_ptr可以释放存储的指针而不删除它吗? 我可以看到文档中不存在发布函数,在常见问题中解释了为什么它不提供发布函数,就像发布不能在不唯一的指针上发布一样。 我的指针是独一无二的。 我怎样才能释放我的指针? 或者哪个提高智能指针类使用,将允许我释放指针? 我希望你不会说使用auto_ptr 🙂
我想问你关于C ++构造函数的最佳实践。 我不太清楚我应该在构造函数中做什么,什么不是。 我应该只使用它的属性初始化,调用父构造函数等? 或者,我甚至可以把更复杂的function,如读取和parsingconfiguration数据,设置外部库aso 还是应该为此编写特殊function? RESP。 init() / cleanup() ? 什么是PRO和CON在这里? 我想通过使用init()和cleanup() ,例如我可以摆脱共享指针。 我可以创build堆栈中的对象作为类属性,并在构造完成后对其进行初始化。 如果我在构造函数中处理它,我需要在运行时实例化它。 然后我需要一个指针。 我真的不知道如何决定。 也许你可以帮我吗?
在C ++ 11中std::shared_ptr有四个构造函数,可以传递typesD deleter对象d 。 这些构造函数的签名如下: template<class Y, class D> shared_ptr(Y * p, D d); template<class Y, class D, class A> shared_ptr(Y * p, D d, A a); template <class D> shared_ptr(nullptr_t p, D d); template <class D, class A> shared_ptr(nullptr_t p, D d, A a); 该标准要求在[util.smartptr.shared.const]typesD是CopyConstructible。 为什么这需要? 如果shared_ptr复制了d那么这些删除者中的哪一个可能被调用? shared_ptr只能保持一个删除器吗? 如果d可以被复制,那么对于shared_ptr 拥有一个删除器意味着什么? CopyConstructible需求的基本原理是什么? PS:这个要求可能会使shared_ptr写删除变得复杂。 unique_ptr似乎对删除器有更好的要求。
我在一个类中有几个容器,例如vector或map,其中包含shared_ptr到堆中的对象。 例如 template <typename T> class MyExample { public: private: vector<tr1::shared_ptr<T> > vec; map<tr1::shared_ptr<T> , int> h; }; 我想有一个这个类的公共接口,它有时返回给const对象(通过shared_ptr<const T> ),有时返回shared_ptr<T>我允许调用者mutate对象。 我想要逻辑常量的正确性,所以如果我标记一个方法为const,它不能改变堆上的对象。 问题: 1)我对tr1::shared_ptr<const T>和tr1::shared_ptr<T>的可交换tr1::shared_ptr<const T>困惑。 当有人将shared_ptr<const T> shared_ptr传递给类时,是否将其作为shared_ptr<T>或shared_ptr<const T>在vector和map中,或者是否更改map,vectortypes(例如insert_elemeent( shared_ptr<const T> obj)? 2)更好的实例化类如下: MyExample<const int> ? 这似乎过分限制,因为我永远不会返回一个shared_ptr<int> ?
我有一个关于C ++ 11最佳实践的问题。 清除shared_ptr时,应该使用不带参数的reset()函数,还是应该将shared_ptr设置为nullptr ? 例如: std::shared_ptr<std::string> foo(new std::string("foo")); foo.reset(); foo = nullptr; 有没有真正的区别,还是有两个方法的优点/缺点?
我在命名约定之间为type :: boost :: shared_ptr模板之间进行了翻转。 例如: typedef boost::shared_ptr<Foo> FooPtr; 在决定一个约定之前,我想看看其他人使用什么。 你的约定是什么? 编辑: 对于在Foo里嵌套typedef的人来说,Foo现在是否“意识到”它将如何传递呢? 它似乎打破封装。 这个怎么样: class Foo { public: typedef std::vector<Foo> Vector }; 你现在不会这样做,是吗? 🙂
我有类似于shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe))我现在需要调用C风格的函数,需要一个指向Type的指针。 我如何从shared_ptr获取它?
我想在某些时候使用boost::log ,但是我不能传递std::shared_ptr作为参数,因为编译器(VS2010)不能将它转换成boost::shared_ptr 。 我真的不喜欢他们是彼此外星人的事实。 有没有一种安全而透明的方法可以将一个人变成另一个人,以免彼此绊倒? 我不认为这两个问题是相同的这个问题的重复。
我一直在使用pimpl习语做一些对象,但我不确定是否使用std::shared_ptr或std::unique_ptr 。 我明白, std::unique_ptr更有效率,但这对我来说并不是什么大问题,因为无论如何这些对象都是相对重量级的,所以std::shared_ptr超过std::unique_ptr的代价相对较小。 我目前正在与std::shared_ptr只是因为额外的灵活性。 例如,使用std::shared_ptr允许我将这些对象存储在散列表中以便快速访问,同时仍然可以将这些对象的副本返回给调用者(因为我相信任何迭代器或引用可能会很快变得无效)。 然而,这些对象实际上并没有被复制,因为变化会影响到所有的副本,所以我想知道,也许使用std::shared_ptr并允许副本是某种反模式或坏东西。 它是否正确?