草庐IT

clone_ptr

全部标签

c++ - 为什么 std::shared_ptr 从基类和派生类调用析构函数,而 delete 只调用基类的析构函数?

这个问题在这里已经有了答案:Howisitpossible(ifitis)toimplementshared_ptrwithoutrequiringpolymorphicclassestohavevirtualdestructor?(3个答案)关闭8年前。为什么在使用std::shared_ptr释放时从基类和派生类调用析构函数,而第二个示例仅从基类调用析构函数?classBase{public:~Base(){std::coutsharedA(newDerived);}std::cout输出:--------------------DeriveddestructorBasedestr

c# - C++ 数组 vs C# ptr 速度混淆

我正在用C#重写一个高性能C++应用程序。C#应用程序明显比C++原始版本慢。分析告诉我,C#应用程序将大部分时间花在访问数组元素上。因此我创建了一个简单的数组访问基准。我得到的结果与othersdoingasimiliarcomparison完全不同.C++代码:#include#include#include#includeusingnamespacestd;usingnamespacestd::chrono;intmain(void){high_resolution_clock::time_pointt1=high_resolution_clock::now();intxRepL

c++ - 将 unique_ptr 返回到多态类型

我试图通过从我的一些方法返回unique_ptr而不是原始指针来变得更安全。但是,在返回指向多态类型的唯一指针时,我有点困惑。我们如何返回指向派生类类型的基类类型的唯一指针?另外,作为一个不太重要的次要问题-我是否使用移动构造函数正确地从基类创建派生类?这是我的最小示例://StandardIncludes#include#include#include#include//--------------------------------------------------------------------------------------------------classBaseR

c++ - delete[] (ptr, 0) 的行为

是否定义了这段代码的行为?int*ptr=newint[10];operatordelete[](ptr,0);这段代码编译得很好,(在我的机器上)似乎什么也没发生。它的行为是否在某处定义? 最佳答案 在这个声明中operatordelete[](ptr,0);显式调用了释放函数voidoperatordelete[](void*,std::size_t)noexcept;调用中类型为size_t的第二个参数刚设置为0。当分配的内存大小不等于0时,第二个参数等于0的调用行为是未定义的。

c++ - 来自同一个 enable_shared_from_this 实例的两个 shared_ptr

鉴于这个类是enable_shared_from_this:classconnection:publicstd::enable_shared_from_this{//...};假设我从sameconnection*创建了两个std::shared_ptr实例,如下所示:std::shared_ptrrc(newconnection);std::shared_ptrfc(rc.get(),[](connectionconst*c){std::cout到目前为止一切正常,因为资源{connection*}由单个shared_ptr—rc准确地说,fc只是有一个假的删除器。之后,我这样做:a

c++ - 我的 API 函数应该采用 shared_ptr 还是 weak_ptr

我目前正在设计一个API,我不确定我的函数是否应该采用shared_ptr或weak_ptr.有包含查看器的小部件。观众有一个功能add_painter这给观众增加了一个画家。当查看器需要重新绘制时,它会使用其绘制器绘制到缓冲区中并显示结果。我得出的结论是观众应该使用weak_ptr捕获画家:一个画家可能被多个观众使用,所以观众不能拥有画家。删除画家应该将其从查看器中删除。这样,用户就不需要记住他们必须调用remove_painter。功能。可能有不同类型的查看器,因此它们隐藏在界面后面。什么签名最适合add_painter界面中的功能?我应该直接使用voidadd_painter(w

c++ - 将 std::exception_ptr 转换为 boost::exception_ptr

我想使用boost::promise::set_exception()需要一个boost::exception_ptr。问题是boost:exception_ptr似乎只有在我用enable_current_exception包裹所有我的抛出时才能正常工作,我想避免这种情况。(无论如何,我无法为第3方图书馆做到这一点。)我在整个代码中使用std::exception_ptr/std::current_exception,所以我正在寻找一种方法来传递std::exception_ptr,其中boost:exception_ptr是预期的。执行以下操作但编译的东西:boost::excep

c++ - gcc 中的错误,或 clang/MSVC 中的扩展

以下代码片段可以在clang和MSVS中编译,但不能在gcc中编译。templateclassclone_ptr;templateclone_ptrmake_cloned(Args...args);//note:everythingnotneededforexamplecutout,so//thisclassisneithercompletenorcorrecttemplateclassclone_ptr{public:clone_ptr():ptr(nullptr){}operatorbool(){returnptr!=nullptr;}T*operator->(){returnpt

c++ - unique_ptr 实现中可能存在的错误

这个问题在这里已经有了答案:Unique_ptrandforwarddeclaration(2个答案)关闭6年前。我试图将unique_ptr类成员与前向声明一起使用。正如许多消息来源所说,例如Forwarddeclarationwithunique_ptr?声明非内联析构函数应该就足够了,但在VS2013和GCC5.3.1中似乎并非如此。我没有测试其他编译器。例子:#includeclassB;classA{public://A();~A();private:std::unique_ptrb;};//classB{};intmain(){Aa;}我只能在取消注释ctor声明或类B声明

c++ - 在什么情况下 std::unique_ptr::operator[] 可能抛出?

我的类有一个operator[],它所做的就是在unique_ptr上调用std::unique_ptr::operator[]>成员(member)。相关部分就是这样:templatestructFoo{T&operator[](constsize_tpos)constnoexcept{returndata_[pos];}std::unique_ptrdata_;};我已将运算符标记为noexcept。但是,unique_ptr::operator[]不是noexcept。我无法找出原因,也不知道我是否可以假设它永远不会抛出。unique_ptr::operator[]本身没有在文档