考虑: struct SomethingThatsABase { virtual bool IsChildOne() const { return false; } virtual bool IsChildTwo() const { return false; } }; struct ChildOne : public SomethingThatsABase { virtual bool IsChildOne() const { return true; } }; struct ChildTwo : public SomethingThatsABase { virtual bool IsChildTwo() const { return true; } }; void SomeClientExpectingAChildOne(std::shared_ptr<ChildOne> const& ptrOne) […]
当使用boost::shared_ptr时,有什么方法可以在脚下boost::shared_ptr ? 换句话说,我使用boost::shared_ptr时必须避免哪些缺陷?
我目前正在学习如何使用智能指针。 然而,在做一些实验时,我发现了以下的情况,我找不到一个可喜的解决scheme: 假设你有一个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; }; 问题是一个类A的对象如何将一个std::shared_ptr自身( this )传递给它的subprocess呢? 有一些Boost共享指针的解决scheme( 获取一个boost::shared_ptr […]
我正在阅读Scott Meyers的“Effective C ++”一书。 有人提到, tr1::shared_ptr和tr1::weak_ptr像内置指针一样工作,但是它们跟踪有多less个tr1::shared_ptrs指向一个对象。 这被称为参考计数。 这可以很好地防止非循环数据结构中的资源泄漏,但是如果两个或多个对象包含tr1::shared_ptrs以形成一个循环,那么即使循环的所有外部指针都具有循环,循环也可以使对方的引用计数保持在零以上被摧毁。 这就是tr1::weak_ptrs进来的地方。 我的问题是循环数据结构如何使引用计数大于零。 我恳请一个例子C ++程序。 weak_ptrs如何解决问题? (再次,请举例)。
我在整个应用程序中广泛使用std :: tr1 :: shared_ptr。 这包括作为函数parameter passing对象。 考虑以下: class Dataset {…} void f( shared_ptr< Dataset const > pds ) {…} void g( shared_ptr< Dataset const > pds ) {…} … 虽然通过shared_ptr传递一个数据集对象保证了它在f和g中的存在,但这些函数可能被调用了数百万次,导致大量的shared_ptr对象被创build和销毁。 下面是最近运行的平面gprofconfiguration文件的一个片段: 每个样品计数为0.01秒。 累计自我累计 时间秒秒呼叫s /呼叫s /呼叫名称 9.74 295.39 35.12 2451177304 0.00 0.00 std :: tr1 :: __ shared_count :: __ shared_count(std :: tr1 :: […]
使用make_shared<T>()而不是使用shared_ptr<T>(new T)有什么缺点make_shared<T>() ? 提升文档状态 用户反复请求一个工厂函数,该函数创build一个给定types的对象并返回一个shared_ptr给它。 除了方便和风格之外,这样的函数也是exception安全的,速度也相当快,因为它可以为对象和相应的控制块使用一个单独的分配,消除了shared_ptr构造开销的重要部分。 这消除了关于shared_ptr的主要效率投诉之一。
什么是相当于以下内容: std::vector<Foo*> vec; vec.push_back(NULL); 当处理boost::shared_ptr ? 它是下面的代码? std::vector< boost::shared_ptr<Foo> > vec; vec.push_back(boost::shared_ptr<Foo>()); 注意:我可能推回很多这样的对象。 我应该在哪里声明一个全局静态的nullPtr对象? 那样只有其中一个必须被修build: boost::shared_ptr<Foo> nullPtr;
unique_ptr和shared_ptr接受一个自定义析构函数来调用它们自己拥有的对象。 但是在unique_ptr的情况下,析构函数作为类的模板parameter passing,而shared_ptr的自定义析构函数的types被指定为构造函数的模板参数。 template <class T, class D = default_delete<T>> class unique_ptr { unique_ptr(T*, D&); //simplified … }; 和 template<class T> class shared_ptr { template<typename D> shared_ptr(T*, D); //simplified … }; 我看不出为什么这样的区别。 什么要求?
我想用-std=c++0x在GCC中启用对C ++ 0x的支持。 我并不一定需要GCC 4.5(和4.6版本)中目前支持的C ++ 11特性 ,但我想开始习惯它们。 例如,在我使用迭代器的一些地方, autotypes会很有用。 但是,我不需要任何当前支持的function。 这里的目标是鼓励我将新标准的特征融入到我的编程“词汇”中。 从你所了解的C ++ 11的支持中,在GCC中启用它是一个好主意,然后通过例如从使用boost::shared_ptr到std::shared_ptr ,混合? PS:我知道这个比较不同风格的shared_ptr 好问题 ,但是我要求在标准最终确定之前就要使用哪个更高层次的build议。 另外一种方法是,像GCC这样的编译器说它支持“实验性function”,这是否意味着在编译期间我可能会遇到奇怪的错误,这将是主要的时间和StackOverflow的隐藏问题的来源? 编辑 :我决定从std::shared_ptr切换回来,因为我不相信它在GCC 4.5中的支持, 如在这个问题中的示例所示 。
如果我声明一个包装在共享指针中的对象: std::shared_ptr<myClass> myClassObject(new myClass()); 那么我想把它作为一个parameter passing给一个方法: DoSomething(myClassObject); //the called method void DoSomething(std::shared_ptr<myClass> arg1) { arg1->someField = 4; } 以上是否简单地增加了shared_pt的引用计数,一切都很酷? 还是会留下一个晃来晃去的指针? 你还是应该这样做吗? DoSomething(myClassObject.Get()); void DoSomething(std::shared_ptr<myClass>* arg1) { (*arg1)->someField = 4; } 我认为第二种方法可能更有效率,因为它只需要复制1个地址(而不是整个智能指针),但是第一种方式看起来更具可读性,我不希望推行性能限制。 我只是想确保没有什么危险的事情。 谢谢。