草庐IT

c++ - std::shared_ptr 初始化:make_shared<Foo>() vs shared_ptr<T>(new Foo)

这个问题在这里已经有了答案:Differenceinmake_sharedandnormalshared_ptrinC++(8个回答)关闭7年前。两者有什么区别:std::shared_ptrp=std::shared_ptr(newint);和std::shared_ptrp=std::make_shared();?我应该更喜欢哪一个?为什么?P。S.很确定这个问题一定已经回答过了,但我找不到类似的问题。 最佳答案 这两个例子都过于冗长了:std::shared_ptrp(newint);//or'=shared_ptr(newi

c++ - std::unique_ptr 用法

std::unique_ptrp1(newint);std::unique_ptrp2(newint);p2=p1;这里似乎p1不再是“唯一的”,因为p2也引用了它这是合法的c++吗?unique_ptr有copy_semantics吗?如果不是,并且它只有移动语义,那么在将p1分配给p2之后是否将其设置为NULL?编辑:好的,所以正确的版本是p2=std::move(p1)据此,在此分配之后,p1无效?和auto_ptr的区别就在这里?明确指定所有权的转移比隐含的更安全,因为我猜想auto_ptr就是这种情况 最佳答案 std::

c++ - 使 shared_ptr 不使用删除

在我的代码中,我希望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));

c++ - boost::shared_ptr 和 std::shared_ptr 的共存

我想在某个时候使用boost::log,但我不能将std::shared_ptr作为参数传递,因为编译器(VS2010)无法转换将其转换为boost::shared_ptr。我真的不喜欢他们彼此是外星人这一事实。是否有一种安全且透明的方式将一个转换为另一个,以免它们相互绊倒?我不认为它与thisquestion重复这表明两者是相同的。 最佳答案 你可以这样做:templateboost::shared_ptrmake_shared_ptr(std::shared_ptr&ptr){returnboost::shared_ptr(pt

c++ - std::shared_ptr 线程安全

我读过"Multiplethreadscansimultaneouslyreadandwritedifferentshared_ptrobjects,evenwhentheobjectsarecopiesthatshareownership."(MSDN:ThreadSafetyintheStandardC++Library)这是否意味着更改shared_ptr对象是安全的?例如,下一个代码是否被认为是安全的:shared_ptrglobal=make_shared();...//Inthread1shared_ptrprivate=global;...//Inthread2globa

c++ - 如何故意删除 boost::shared_ptr?

我有很多boost::shared_ptr对象,并且在某些时候我故意想要delete其中一些释放一些内存。(那时我知道我再也不需要指向MyClass的对象了。)我该怎么做呢?我想你不能只调用delete()使用我通过get()获得的原始指针.我见过一个函数get_deleter(shared_ptrconst&p)在boost::shared_ptr,但我不知道如何使用它,而且它旁边还写着experimental。(我想我有Boost1.38。)也许只是分配一个新的空boost::shared_ptr变量?那应该丢弃旧值并将其删除。 最佳答案

c++ - 将 unique_ptr 传递给函数

我正在尝试“现代化”一些现有代码。我有一个类,它当前有一个成员变量“Device*device_”。它在一些初始化代码中使用new创建实例,并在析构中有一个“deletedevice_”。该类的成员函数调用许多以Device*作为参数的其他函数。这很好用,但为了“现代化”我的代码,我认为我应该将变量更改为"std::unique_ptrdevice_"并删除对删除的显式调用,这使代码更安全,通常更好。我的问题是这个-我应该如何将device_变量传递给所有需要它作为参数的函数?我可以调用.get来获取每个函数调用中的原始指针。但这看起来很丑陋,并且浪费了一些首先使用unique_ptr

c++ - 你对 typedef'ing shared_ptr 的约定是什么?

我在typedef'ingboost::shared_ptr模板的命名约定之间来回切换。例如:typedefboost::shared_ptrFooPtr;在确定约定之前,我想看看其他人使用什么。你的约定是什么?编辑:对于那些将typedef嵌套在Foo中的人,Foo现在“知道”它的样子了绕过?它似乎打破了封装。这个怎么样:classFoo{public:typedefstd::vectorVector;};你现在不会这样做,对吗?:-) 最佳答案 回答:不要这样做。这对您和其他人都很方便。说出你的意思。

c++ - 从shared_ptr 得到一个正常的ptr?

我有类似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在库函数完成之前不会超出范围-否则可能会导致错误,因为库可能会在指针完成后尝试对指针执行某些

c++ - 为什么不能从 unique_ptr 构造weak_ptr?

如果我理解正确,weak_ptr不会增加托管对象的引用计数,因此它不代表所有权。它只是让您访问一个对象,该对象的生命周期由其他人管理。所以我真的不明白为什么不能从unique_ptr构造weak_ptr,而只能从shared_ptr构造。有人能简单解释一下吗? 最佳答案 如果您考虑一下,weak_ptr必须引用对象本身以外的其他内容。这是因为对象可以不复存在(当没有更多的强指针指向它时)并且weak_ptr仍然必须引用包含对象不再存在的信息的东西。使用shared_ptr,该东西就是包含引用计数的东西。但是对于unique_ptr,