我正在尝试“现代化”一些现有代码。我有一个类,它当前有一个成员变量“Device*device_”。它在一些初始化代码中使用new创建实例,并在析构中有一个“deletedevice_”。该类的成员函数调用许多以Device*作为参数的其他函数。这很好用,但为了“现代化”我的代码,我认为我应该将变量更改为"std::unique_ptrdevice_"并删除对删除的显式调用,这使代码更安全,通常更好。我的问题是这个-我应该如何将device_变量传递给所有需要它作为参数的函数?我可以调用.get来获取每个函数调用中的原始指针。但这看起来很丑陋,并且浪费了一些首先使用unique_ptr
关于pimplidiom有一些关于SO的问题,但我更好奇它在实践中的使用频率。我了解在性能和封装之间需要权衡取舍,另外由于额外的重定向会导致一些调试烦恼。这样,这是应该在每个类(class)还是全有或全无的基础上采用的东西?这是最佳实践还是个人偏好?我意识到这有点主观,所以让我列出我的首要任务:代码清晰代码可维护性性能我总是假设我需要在某个时候将我的代码公开为一个库,所以这也是一个考虑因素。编辑:欢迎提出任何其他选项来完成同样的事情。 最佳答案 我想说的是,您是按类(class)还是全有或全无的基础上进行这取决于您首先选择pimpl
我在typedef'ingboost::shared_ptr模板的命名约定之间来回切换。例如:typedefboost::shared_ptrFooPtr;在确定约定之前,我想看看其他人使用什么。你的约定是什么?编辑:对于那些将typedef嵌套在Foo中的人,Foo现在“知道”它的样子了绕过?它似乎打破了封装。这个怎么样:classFoo{public:typedefstd::vectorVector;};你现在不会这样做,对吗?:-) 最佳答案 回答:不要这样做。这对您和其他人都很方便。说出你的意思。
我有类似shared_ptrt(makeSomething(),mem_fun(&Type::deleteMe))的东西我现在需要调用需要指向Type的指针的C风格函数。.我如何从shared_ptr获得它? 最佳答案 使用get()方法:boost::shared_ptrfoo_ptr(newfoo());foo*raw_foo=foo_ptr.get();c_library_function(raw_foo);确保您的shared_ptr在库函数完成之前不会超出范围-否则可能会导致错误,因为库可能会在指针完成后尝试对指针执行某些
如果我理解正确,weak_ptr不会增加托管对象的引用计数,因此它不代表所有权。它只是让您访问一个对象,该对象的生命周期由其他人管理。所以我真的不明白为什么不能从unique_ptr构造weak_ptr,而只能从shared_ptr构造。有人能简单解释一下吗? 最佳答案 如果您考虑一下,weak_ptr必须引用对象本身以外的其他内容。这是因为对象可以不复存在(当没有更多的强指针指向它时)并且weak_ptr仍然必须引用包含对象不再存在的信息的东西。使用shared_ptr,该东西就是包含引用计数的东西。但是对于unique_ptr,
我想这是不言自明的-我似乎无法使用C++11功能,即使我认为我已经正确设置了所有内容-这可能意味着我没有。这是我的代码:#include#includeclassObject{private:intvalue;public:Object(intval){value=val;}intget_val(){returnvalue;}voidset_val(intval){value=val;}};intmain(){Object*obj=newObject(3);std::unique_ptrsmart_obj(newObject(5));std::coutget_val()这是我的g++版
与Boost中的情况一样,C++11提供了一些用于转换shared_ptr的函数:std::static_pointer_caststd::dynamic_pointer_caststd::const_pointer_cast然而,我想知道为什么没有unique_ptr的等效函数。考虑以下简单示例:classA{virtual~A();...}classB:publicA{...}unique_ptrpA(newB(...));unique_ptrqA=std::move(pA);//Thisislegalsincethereisnocastingunique_ptrpB=std::m
在比较指针的两种变体(经典指针与shared_ptr)时,我对程序运行速度的显着提高感到惊讶。为了测试2DDelaunay增量插入算法已被使用。编译器设置:VS2010(release)/O2/MD/GL,W7Prof,CPU3.GHZDualCore结果:shared_ptr(C++0x00):N[points]t[sec]1000006200000113000001690000036指针:N[points]t[sec]1000000,5200000130000029000004shared_ptr版本的运行时间大约长10倍。这是编译器设置造成的还是C++0x00shared_ptr
在我最近查看的一段代码中,它用g++-4.6编译得很好,我遇到一个奇怪的尝试创建一个std::shared_ptr来自std::unique_ptr:std::unique_ptrfoo...std::make_shared(std::move(foo));这对我来说似乎很奇怪。这应该是std::shared_ptr(std::move(foo));afaik,虽然我对Action并不十分熟悉(而且我知道std::move只是一个类型转换,没有任何Action)。在此SSC(NUC*)E上使用不同的编译器进行检查#includeintmain(){std::unique_ptrfoo(
我一直在使用pimpl成语制作一些对象,但我不确定是否使用std::shared_ptr或std::unique_ptr.我知道std::unique_ptr效率更高,但这对我来说不是什么大问题,因为这些对象无论如何都相对重量级,所以std的成本::shared_ptr而不是std::unique_ptr相对较小。我目前使用std::shared_ptr只是因为它具有额外的灵active。例如,使用std::shared_ptr允许我将这些对象存储在hashmap中以便快速访问,同时仍然能够将这些对象的拷贝返回给调用者(因为我相信任何迭代器或引用可能很快无效)。但是,这些对象实际上并没