草庐IT

pimpl_ptr

全部标签

原始指针和 shared_ptr 之间的 C++ 接口(interface)

我的代码自始至终都使用原始指针。它需要调用一个方法,将原始指针放入shared_ptr。这个方法不受我控制,属于外部api。我不能只将指针传递给shared_ptr因为它什么时候会被删除当shared_ptr超出方法的范围时(当方法返回时)。除了在内部代码中将原始指针设为shared_ptr之外,我还有其他选择吗? 最佳答案 这听起来有些不寻常并且可能非常危险,但是您可以通过在构造shared_ptr时使用无操作删除器来完成此操作:structno_op_delete{voidoperator()(void*){}};int*p=0

c++ - 在 shared_ptr 的容器上使用 C++ std::equal

我有一个std::shared_ptr的容器。我想使用std::equal比较两个容器。类A定义了operator==。我想使用其运算符==比较每个元素是否等效,而不是shared_ptr中定义的那个。我是否需要让一个函数或函数对象传递给equal?或者是否有一些内置的东西会更简单(比如中定义的东西)? 最佳答案 您将需要一个函数或一个函数对象或一个lambda表达式(因为您可以使用std::shared_ptr,所以您已经启用了C++0x的某些部分)。中没有任何内容帮助你,但有一些东西在提升:indirectiterator#in

c++ - 这是对 intrusive_ptr 的有效使用吗?

在我的代码中,当涉及到intrusive_ptrs时,我遵循两条规则:按值传递原始指针意味着保证原始指针在该函数的生命周期内有效。如果要在函数的生命周期之外存储和使用原始指针,则应将其存储在intrusive_ptr中。许多Internet评论者写道,shared_ptr应该比intrusive_ptr更受欢迎,除非使用第三方代码。但是,intrusive_ptr避免了传递智能指针,因为您可以从原始指针创建intrusive_ptr,就像在函数生命周期之外需要对象时一样。我只是担心我遗漏了一些东西,因为我读过的任何东西都没有说明有关intrusive_ptrs的观​​点,而且大多数人似

c++ - const boost::shared_ptr<T>& 作为函数参数的目的?

我正在使用某个大型且维护良好的开源C++库,并遇到了一个具有以下形式的构造函数的类定义classSomeClass{SomeClass(constboost::shared_ptr&);}我的问题是:传递constboost::shared_ptr有什么意义?引用?传递boost::shared_ptr是否真的存在不可忽略的开销?按值(value)计算,或者传递boost::shared_ptr是否存在其他危险?按我不知道的值(value)? 最佳答案 按值传递将复制它,这会导致引用计数增加,并在所有线程之间同步。绝对不可忽略。

c++ - 单元测试、模拟和 unique_ptr

有一个正在测试的类目前接受unique_ptr&&在它的构造函数中,表示它想要获得接口(interface)实现的单一所有权。想要使用模拟Interface测试此类时会出现问题虽然:模拟框架(HippoMocks)只给我Interface*我不拥有,因此无法删除。我以前在测试constshared_ptr&的类(class)时遇到过同样的问题作为参数,但通过提供自定义的无操作删除器来修复:templatevoidNoDelete(T*){}//createashared_ptrwithouteffectivedeletertemplatestd::shared_ptrmock_shar

c++ - Qt raw 与 std::shared_ptr

我注意到当在QT中用shared_ptr替换原始指针时,我的代码不再起作用。例如,如果不是QTreeWidgetItem*vItem(newQTreeWidgetItem(ItemTitle));我用std::shared_ptrvItem(newQTreeWidgetItem(ItemTitle));然后,要么程序崩溃,要么什么都没做(即使我使用.get()函数来获取来self代码后面共享的原始指针)。有谁知道可能是什么原因? 最佳答案 对Qt模型项使用共享指针会导致所有权冲突:QTreeWidget获取您传递给它的任何QTree

c++ - 通过引用传递与通过 shared_ptr 传递

Stackoverflow上的大多数问题都是关于shared_ptr应该按ref还是按值传递。但是我的问题是这样的例子:classFoo;voidfunction1(Foo&ff){ff.m_abc=1024;}voidfunction2(conststd::shared_ptr&ff){ff->m_abc=1024;}function1和function2可能会使用和更改ff的某些部分。我的案例:我需要调用带有参数*this或shared_from_this()的函数。print(msg,*this);orprint(msg,this->shared_from_this());我可以

c++ - std::unique_ptr 和指向指针的指针

我想结合使用std::unique_ptr和FreeImage的FITAG。普通C中的代码将是:...loadimage;FITAG*tag=NULL;FreeImage_GetMetadata(FIMD_EXIF_EXIF,bitmap,"Property",&tag);...dosomestuffwithtag;FreeImage_DeleteTag(tag);...deleteimage;我对unique_ptr的尝试:std::unique_ptrtag(NULL,&FreeImage_DeleteTag);FreeImage_GetMetadata(FIMD_EXIF_EXI

c++ - 一个简单的 std::shared_ptr 构造案例的段错误

来自cppreference我了解到std::shared_ptr有一个构造函数:templateexplicitshared_ptr(Y*ptr);然后我试了一段代码如下:#include#include#includeintmain(void){///block1{std::shared_ptrs1(newstd::string("good"));std::shared_ptrs2(s1.get());///s2std::cerri1(newint(1));std::shared_ptri2(i1.get());///i2std::cerr它会导致block1的段错误,但不会导致b

c++ - 放置指向 shared_ptr 的多重映射的指针不起作用

vector工作正常Headerstd::vector>subnodes_m;DefinitionvoidCompositeSceneNode::AddChild(SceneNode*subnode_p){subnodes_m.emplace_back(subnode_p);}multimap没有Headerstd::multimap>subnodes_m;DefinitionvoidCompositeSceneNode::AddChild(SceneNode*subnode_p,unsignedintlayerIndex){subnodes_m.emplace(layerIndex,