草庐IT

weak_ptr_cast

全部标签

c++ - dynamic_cast<void*> 什么时候有用?

这个问题在这里已经有了答案:Aretherepracticalusesfordynamic-castingtovoidpointer?(7个回答)关闭8年前。5.2.7/7大致如下:IfTis"pointertocvvoid",theresultisapointertothemostderivedclasspointedtobyx.这种语法有什么好的应用?什么时候应该dynamic_cast有用吗? 最佳答案 一个常见的原因是要弄清楚两个接口(interface)IA*和IB*实际上是否指向同一个底层对象。如果需要,请使用类型转换。

c++ - 通过模板中的成员函数指针对 shared_ptr 的成员函数调用

这是一个模板函数,它接受一个指针(或类似对象的指针)和一个成员函数:templateintexample(Ptrptr,MemberFunctorfunc){return(ptr->*func)();}如果与普通指针一起使用时有效:structC{intgetId()const{return1;}};C*c=newC;example(c,&C::getId);//Worksfine但它不适用于智能指针:std::shared_ptrc2(newC);example(c2,&C::getId);错误信息:error:C2296:'->*':illegal,leftoperandhasty

C++ 类型转换。 static_cast 什么时候会成功,而 reinterpret_cast 会导致问题?

我知道static_cast是从一种类型到另一种类型的转换,(直观地)是一种在某些情况下可以成功并且在没有危险转换的情况下有意义的转换。同时,reinterpret_cast是表示不安全转换的强制转换,可能会将一个值的位重新解释为另一个值的位。有人能描述一下代码编译、转换和static_cast不会导致问题,但使用reinterpret_cast会出现问题的场景吗? 最佳答案 这样就可以了:#includeusingnamespacestd;structC{intn;};structA{intn;};structB:A,C{};in

c++ - 传递 const shared_ptr<T>& 而不是 shared_ptr<T> 作为参数

我已经阅读了大量关于应用程序中涉及智能指针时的性能问题的讨论。常见的建议之一是将智能指针作为const&而不是拷贝传递,如下所示:voiddoSomething(std::shared_ptro){}对voiddoSomething(conststd::shared_ptr&o){}但是,第二个变体实际上不是破坏了共享指针的目的吗?我们实际上在这里共享共享指针,因此如果由于某些原因指针在调用代码中被释放(考虑可重入性或副作用),则const指针将变为无效。共享指针实际上应该防止的情况。我知道const&节省了一些时间,因为不涉及复制,也没有锁定来管理引用计数。但代价是代码的安全性降低了

c++ - 在 std::shared_ptr 上使用 .reset() 是否会删除所有实例

我是shared_ptr的新手,我正在尝试找出.reset()函数的确切功能。#include#includeusingnamespacestd;classSomeClass{};intmain(){shared_ptrsp(nullptr);//dosomestuff,spnowhas10co-ownerscout会输出100所以自从我使用了重置功能后,所有实例都从内存中删除了吗?如,我刚刚用sp消除了任何可能的内存泄漏吗?显然这是我快速编造的一个玩具示例,如果有任何错误,请见谅。跟进情况:shared_ptrreturnThis(){shared_ptrsomeObject(new

c++ - 是否应允许 std::unique_ptr<void>

这是一个非常简单的问题。考虑以下代码:#include#includetypedefstd::unique_ptrUniqueVoidPtr;intmain(){UniqueVoidPtrp(newint);return0;}使用以下命令g++-std=c++0x-oprogfile.cpp用cygwin(g++4.5.3)编译就可以了。但是,使用microsoft编译器(VS2010或2013)编译时出现此错误:C:\ProgramFiles(x86)\MicrosoftVisualStudio10.0\VC\INCLUDE\memory(2067):errorC2070:'void

c++ - unique_ptr 线程安全吗?

unique_ptr线程安全吗?下面的代码不可能两次打印相同的数字吗?#include#include#include#includeusingnamespacestd;intmain(){unique_ptrwork;threadt1([&]{while(true){constunique_ptrlocalWork=move(work);if(localWork)printf("thread1:%d\n",*localWork);this_thread::yield();}});threadt2([&]{while(true){constunique_ptrlocalWork=mov

c++ - 原始指针和weak_ptr有什么区别?

如标题。这个问题可能已经有了答案,但我没有找到答案。 最佳答案 裸指针和weak_ptr之间的基本概念区别在于,如果指向的对象被销毁,裸指针不会告诉你。这称为悬空指针:指向不存在的对象的指针。它们通常很难追踪。weak_ptr会。为了使用weak_ptr,您必须首先将其转换为shared_ptr。如果那个shared_ptr没有指向任何东西,那么这个对象就被删除了。例如:#include#includestd::weak_ptrwp;voidtest(){autospt=wp.lock();//Hastobecopiedintoas

c++ - GCC 错误 : cannot convert 'const shared_ptr<...>' to 'bool' in return

我正在切换到GCC4.6.1,它开始提示在GCC4.4和MSVC10上运行良好的代码。从这样的函数返回时,它似乎不想在shared_ptr和bool之间进行转换:classClass{shared_ptrpointer_;};boolClass::Function()const{returnpointer_;}使用returnstatic_cast(pointer_);一切正常。到底他妈发生了什么?这是--std=cpp0x. 最佳答案 在C++11中,shared_ptr有一个explicitoperatorbool这意味着sha

c++ - 为什么 std::make_unique 而不是 std::unique_ptr::make?

为什么C++采用自由函数:std::make_unique(...);std::make_shared(...);而不是使用静态成员函数:std::unique_ptr::make(...);//staticstd::shared_ptr::make(...);//static? 最佳答案 TL;DR:静态成员函数始终可以访问私有(private)数据,但自由函数只有在明确标记为friend时才能访问私有(private)数据。选择将这些函数实现为自由函数(有一小部分实现为友元函数)不是随机的历史产物,而是一个经过深思熟虑的决定,以