我们有一个C++库,我们提供给几个不同的客户。最近,我们从在公共(public)接口(interface)中使用原始指针切换到使用boost::sharedptr。正如您可能猜到的那样,这提供了巨大的好处,因为现在客户不再需要担心谁需要删除什么以及何时删除。当我们进行转换时,我认为这是正确的做法,但让我感到困扰的是,我们必须在我们的公共(public)界面中包含来自第三方库的东西——通常,如果可以的话,你会避免这种事情。我合理化了boost现在实际上是C++语言的一部分,我们的用例要求客户端代码和库都保存指向对象的指针。然而最近我们的一个客户问我们是否可以切换到在接口(interfac
考虑这个最小的例子:#includestructB{typedefstd::shared_ptrPtr;};structA{operatorB::Ptr(){//typeconversionoperator();//|}//|};//|//|intmain(){//|A*a=newA;//|B::Ptr{*a};//copyconstructionfroma'simplicitcasttoB::Ptr----+}shared_ptr的这种无辜的复制结构在g++4.6.3x86_64-linux-gnu上严重失败,但似乎适用于g++4.5(请注意,较新的版本中断,而较旧的版本有效!)。从
在llvm的编译器实现教程(例如here)中使用了llvm::make_unique。他们不使用std::make_unique的原因是什么?我找不到任何明确的文档。 最佳答案 TL;DR;LLVM是使用符合C++11的代码编写的,而std::make_unique是一个C++14特性。所以如果他们想要make_unique他们需要实现它。详情如果我们转到LLVMCodingStandardsC++StandardVersionssection说:LLVM,Clang,andLLDarecurrentlywrittenusingC+
这更像是一个设计问题(我知道为什么会这样,只是想看看人们如何处理它)。假设我有一个简单的链表struct:structList{inthead;std::shared_ptrtail;};shared_ptr允许在多个列表之间共享子列表。但是,当列表变得很长时,其析构函数中可能会发生堆栈溢出(由shared_ptrs的递归释放引起)。我尝试过使用显式堆栈,但这变得非常棘手,因为一个尾部可以由多个列表拥有。如何设计我的List来避免这个问题?更新:澄清一下,我不是在重新发明轮子(std::forward_list)。上面的List只是真实数据结构的简化版。真正的数据结构是一个有向无环图,
自从boost::/std::shared_ptr具有类型删除其删除器的优势,您可以做一些不错的事情,例如#includetypedefstd::shared_ptrgc_ptr;intmain(){gc_ptrp1=newint(42);gc_ptrp2=newfloat(3.14159);gc_ptrp3=newchar('o');}由于保存了正确的删除器,这将正确删除所有指针。如果您确保接口(interface)的每个实现总是使用shared_ptr创建(或make_shared),你真的需要virtual析构函数?我会宣布virtual无论如何,但我只想知道,因为shared_
我目前在使用boostenable_shared_from_this和多重继承时遇到了一些麻烦。场景可以描述如下:类A实现了一些功能,应该继承自enable_shared_from_this类B实现了另一个功能,应该继承自enable_shared_from_thisD类继承A和B的功能(classD:publicA,publicB{})当使用类D中的某些类B功能时,出现异常(bad_weak_ptr)从D类继承enable_shared_from_this对我来说不是一个选择我不确定如何解决这个问题。哦,我使用的是VisualC++2010。 最佳答案
我意识到在GCC4.7中可以正常编译:#includeintmain(){std::shared_ptrp;p=0;}但是,int或int*没有赋值运算符,int或都没有隐式构造函数>int*也可以。int*有一个构造函数,但它是显式的。我检查了标准库的实现,构造函数确实是显式的,看不到任何可疑的赋值运算符。程序实际上是格式正确的还是GCC搞砸了我? 最佳答案 之所以有效,是因为这个标准的简短引用:§4.10[conv.ptr]p1Anullpointerconstantisanintegralconstantexpression(
作为this的后续行动发布后我想知道它的make_unique实现如何与分配函数临时缓冲区数组一起使用,例如以下代码。f(){autobuf=newint[n];//temporarybuffer//usebuf...delete[]buf;}这可以替换为对make_unique的一些调用,然后会使用[]-version的delete吗? 最佳答案 这是另一个解决方案(除了Mike的):#include#include#includetemplatetypenamestd::enable_if::value,std::unique_
这个问题在这里已经有了答案:shared_ptrmagic:)(3个回答)关闭8年前。为什么当使用std::shared_ptr释放时,当第二个示例仅从基类调用析构函数时,会同时从基类和派生类调用析构函数?classBase{public:~Base(){std::coutsharedA(newDerived);}std::cout输出:--------------------DeriveddestructorBasedestructor--------------------Basedestructor我期望在这两种情况下都有相同的行为。 最佳答案
Thiscodecompiles但我想知道应该首选哪个版本:#include#includeusingnamespacestd;tuplereturn_tuple1(){inta=33;intb=22;intc=31;returntie(a,b,c);}tuplereturn_tuple2(){inta=33;intb=22;intc=31;returnmake_tuple(a,b,c);}intmain(){autoa=return_tuple1();autob=return_tuple2();return0;}由于该函数按值返回一个元组,因此使用std::tie应该没有任何问题,对