在我的代码中,我希望boost::shared_ptr不调用delete,而是调用ptr->deleteMe()。我还有一些返回ptr的C风格函数。我可以叫它lib_freeXYZ(ptr);而不是尝试删除? 最佳答案 或者如何使用STL来提供包装仿函数-DougT.描述但没有自定义调用者。boost::shared_ptrptr(newT,std::mem_fun_ref(&T::deleteMe));boost::shared_ptrptr(newS,std::ptr_fun(lib_freeXYZ));
我想在某个时候使用boost::log,但我不能将std::shared_ptr作为参数传递,因为编译器(VS2010)无法转换将其转换为boost::shared_ptr。我真的不喜欢他们彼此是外星人这一事实。是否有一种安全且透明的方式将一个转换为另一个,以免它们相互绊倒?我不认为它与thisquestion重复这表明两者是相同的。 最佳答案 你可以这样做:templateboost::shared_ptrmake_shared_ptr(std::shared_ptr&ptr){returnboost::shared_ptr(pt
我读过"Multiplethreadscansimultaneouslyreadandwritedifferentshared_ptrobjects,evenwhentheobjectsarecopiesthatshareownership."(MSDN:ThreadSafetyintheStandardC++Library)这是否意味着更改shared_ptr对象是安全的?例如,下一个代码是否被认为是安全的:shared_ptrglobal=make_shared();...//Inthread1shared_ptrprivate=global;...//Inthread2globa
我有很多boost::shared_ptr对象,并且在某些时候我故意想要delete其中一些释放一些内存。(那时我知道我再也不需要指向MyClass的对象了。)我该怎么做呢?我想你不能只调用delete()使用我通过get()获得的原始指针.我见过一个函数get_deleter(shared_ptrconst&p)在boost::shared_ptr,但我不知道如何使用它,而且它旁边还写着experimental。(我想我有Boost1.38。)也许只是分配一个新的空boost::shared_ptr变量?那应该丢弃旧值并将其删除。 最佳答案
我正在尝试“现代化”一些现有代码。我有一个类,它当前有一个成员变量“Device*device_”。它在一些初始化代码中使用new创建实例,并在析构中有一个“deletedevice_”。该类的成员函数调用许多以Device*作为参数的其他函数。这很好用,但为了“现代化”我的代码,我认为我应该将变量更改为"std::unique_ptrdevice_"并删除对删除的显式调用,这使代码更安全,通常更好。我的问题是这个-我应该如何将device_变量传递给所有需要它作为参数的函数?我可以调用.get来获取每个函数调用中的原始指针。但这看起来很丑陋,并且浪费了一些首先使用unique_ptr
我在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