草庐IT

long_ptr

全部标签

c++ - std::auto_ptr 或 boost::shared_ptr 用于 pImpl 成语?

使用pImplidiom时是否最好使用boost:shared_ptr而不是std::auto_ptr?我确定我曾经读过boost版本对异常更友好?classFoo{public:Foo();private:structimpl;std::auto_ptrimpl_;};classFoo{public:Foo();private:structimpl;boost::shared_ptrimpl_;};[编辑]使用std::auto_ptr是否总是安全的,或者是否存在需要替代boost智能指针的情况? 最佳答案 您不应该为此使用std

c++ - 将 const std::unique_ptr 用于 pimpl 习惯用法

在HerbSutter'stalkatCppCon16他建议用conststd::unique_ptr编写pimplidiom(大约10分钟)。这应该如何与移动构造函数/赋值一起使用?c++17中有什么东西吗?我找不到任何东西。 最佳答案 如果您的类应该是永不为空的,那么非常量的唯一ptr(具有默认移动/分配)是不合适的。movector和moveassign都会清空rhs。一个constuniqueptr将禁用这些自动方法,如果你想移动,你必须在impl中编写它(并在外面有点胶水)。我会亲自编写一个具有我想要的语义的值ptr(然后

c++ - 为什么 auto_ptr 不支持 op->*()

auto_ptr(以及shared_ptr)尽量使它们的使用透明;也就是说,理想情况下,您应该无法区分您使用的是auto_ptr还是指向对象的真实指针。考虑:classMyClass{public:voidfoo(){}};MyClass*p=newMyClass;auto_ptrap(newMyClassp);p->foo();//Nonotationaldifferenceinusingrealap->foo();//pointersandauto_ptrs当你尝试通过一个指向成员的指针来调用一个成员函数时,这是有区别的,因为auto_ptr显然没有实现op->*():void(M

c++ - 绑定(bind)到一个weak_ptr

有没有办法std::bind到std::weak_ptr?我想存储一个“弱函数”回调,当被调用者被销毁时会自动“断开”。我知道如何使用shared_ptr创建std::function:std::functionMyClass::GetCallback(){returnstd::function(std::bind(&MyClass::CallbackFunc,shared_from_this()));}然而,返回的std::function让我的对象永远活着。所以我想将它绑定(bind)到weak_ptr:std::functionMyClass::GetCallback(){std

c++ - 关于 shared_ptr 用法的问题 - C++

我对使用shared_ptr的最佳实践有几个问题。问题1复制shared_ptr便宜吗?还是我需要将它作为对我自己的辅助函数的引用并作为值返回?类似的,voidinit_fields(boost::shared_ptr&/*p_foo*/);voidinit_other_fields(boost::shared_ptr&/*p_foo*/);boost::shared_ptrcreate_foo(){boost::shared_ptrp_foo(newfoo);init_fields(p_foo);init_other_fields(p_foo);}问题2我应该使用boost::mak

c++ - long long 在 32 位机器上的实现

根据c99标准,longlong的大小应至少为64位。这是如何在32位机器中实现的(例如,2longlongs的加法或乘法)。还有,C++中的longlong等价物是什么。 最佳答案 C++中的等价物也很长。它不是标准要求的,但大多数编译器都支持它,因为它非常有用。它是如何实现的?大多数计算机体系结构已经内置了对多字加法和减法的支持。他们不直接进行64位加法,而是使用进位标志和特殊的加法指令从两个32位加法构建一个64位加法。减法也存在相同的扩展(在这些情况下进位称为借位)。长字乘法和除法可以从较小的乘法中构建,而无需进位标志的帮助

c++ - 带有派生类的 std::unique_ptr

我对c++11指针有疑问。具体来说,如何将基类的唯一指针转为派生类?classBase{public:intfoo;}classDerived:publicBase{public:intbar;}...std::unique_ptrbasePointer(newDerived);//now,howdoIaccessthebarmember?这应该是可能的,但我不知道怎么做。每次我尝试使用basePointer.get()我最终导致可执行文件崩溃。提前致谢,如有任何建议,我们将不胜感激。 最佳答案 如果它们是多态类型并且您只需要一个指

C++ 原始指针和 std::shared_ptr

我正在使用std::shared_ptr,在我的软件开发过程中,我遇到了几个让我怀疑内存管理的案例。我有一个第三方图书馆总是给我来自函数的原始指针,在我的代码中我正在转换它们进入std::shared_ptr(来自std而不是来自boost。顺便说一下有什么区别他们俩?)。所以假设我有以下代码:ClassA*raw=newClassA;std::shared_ptrshared(raw);当共享指针超出范围时会发生什么(假设它是在函数中本地声明的现在我正在退出该功能)。ClassA对象是否仍然存在,因为原始指针是指向它吗? 最佳答案

c++ - C和C++中long double和double的区别

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:longdoublevsdouble我是编程新手,我无法理解C和C++中longdouble和double之间的区别。我试图谷歌它,但无法理解它并感到困惑。有人可以帮忙吗? 最佳答案 引用C++标准,§3.9.1¶8:Therearethreefloatingpointtypes:float,double,andlongdouble.Thetypedoubleprovidesatleastasmuchprecisionasfloat,andthetypelo

c++ - 为什么没有 unique_ptr::operator*() 的安全替代方案?

std::vector有成员函数at()作为operator[]的安全替代,因此可以应用边界检查并且没有创建悬空引用:voidfoo(std::vectorconst&x){constauto&a=x[0];//Whatifx.empty()?Undefinedbehavior!constauto&a=x.at(0);//Throwsexceptionifx.empty().}但是,std::unique_ptr缺少相应的功能:voidfoo(std::unique_ptrconst&x){constauto&a=*x;//Whatifbool(x)==false?Undefinedb