草庐IT

weak_ptr_cast

全部标签

c++ - 与普通指针相比,按值传递 `unique_ptr` 是否会降低性能?

Commonwisdomisthatstd::unique_ptrdoesnotintroduceaperformancepenalty(andnotamemorypenaltywhennotusingadeleterparameter),但我最近偶然发现了一个讨论,该讨论表明它实际上引入了一个额外的间接寻址,因为unique_ptr无法在具有ItaniumABI的平台上的寄存器中传递。发布的示例类似于#includeintfoo(std::unique_ptru){return*u;}intboo(int*i){return*i;}Whichgeneratesanadditional

c++ - 从 unique_ptr<T[]> 初始化 shared_ptr<T>

[跟进this问题]最近我一直在处理指向C风格数组的智能指针。我最终完成了推荐的事情并改为使用指向vector的智能指针,但在那段时间里,我得到了一些建议:不要使用shared_ptr对象来管理最初使用make_unique创建的数组因为它不会调用delete[]而是delete.这对我来说似乎不合逻辑,我检查了两个Coliru和标准:这段代码:#include#includeintmain(){std::coutmyUnique(customArrayAllocator(4),customArrayDeleter);std::coutmyShared=std::move(myUniq

c++ - 具有自定义删除器的 unique_ptr 构造函数被删除

这个例子在gcc4.8.3下编译和运行良好:#include#include#includeintmain(){autostr=newconstchar[6]{'h','e','l','l','o','\0'};std::unique_ptr>u_ptr(str,[](constchar*s){delete[]s;});std::cout但是当我尝试使用VisualStudioProfessional2013时,它无法编译(提示函数已删除)。这在VisualStudio2013中还不可能吗?还是我的示例代码有误而gcc忽略了我的错误?错误是:main.cpp(8):errorC2280

c++ - reinterpret_cast 可以更改对象表示吗?

我对reinterpret_cast的心理模型一直是,将表达式的位序列视为不同类型,并且cppreference(注意:这不是C++标准的引用)似乎同意这一点:Unlikestatic_cast,butlikeconst_cast,thereinterpret_castexpressiondoesnotcompiletoanyCPUinstructions.Itispurelyacompilerdirectivewhichinstructsthecompilertotreatthesequenceofbits(objectrepresentation)ofexpressionasifi

C++:将像 unique_ptr::get() 这样的参数传递给函数是否安全

传递像getAName(getA().get())这样的函数参数是安全的?getA()返回一个对象unique_ptr.我在VS2010上测试了下面的整个代码,它有效。但我想确定它是否是c++标准,与其他c++编译器一起使用是否安全?#include"stdafx.h"#include#includeusingnamespacestd;classA{public:A(){coutgetA(){returnstd::unique_ptr(newA());;}voidgetAName(A*a){if(a){coutname().c_str()控制台的输出是:A()A~()为了所有编译器的安

c++ - 我可以通过 reinterpret_cast 将 int 的空指针转换为 long 类型吗

int*pt=0;longi=reinterpret_cast(pt);我保证为0吗?这是明确定义的还是实现定义的?我检查了c++标准,但它只说明了Apointertoadataobjectortoafunction(butnotapointertomember)canbeconvertedtoanyintegertypelargeenoughtocontainit.在这种情况下,pt不指向任何数据对象。该规则适用于这种情况吗? 最佳答案 否,i不一定是任何值。结果是实现定义的。†在C++中,指针的表示是实现定义的,包括空指针的表示

c++ - 在 C 接口(interface)中使用 shared_ptr?

我有一个要移植到C++的C库,它大量使用手动引用计数结构。我考虑过使用shared_ptr来自动处理引用计数,但我还想维护CAPI。旧签名看起来像这样:Object*object_create(void);Object*object_retain(Object*o);voidobject_release(Object*o);如果我使用shared_ptr,有什么方法可以有效地在CAPI中公开此手动引用计数? 最佳答案 shared_ptr的问题,正如您已经发现的那样,您不能修改引用计数,除非通过构造或销毁实例。所以不,除了为每个构造

c++ - 查找 boost::shared_ptr 循环引用

是否有查找shared_ptr的循环引用的任何提示/技巧?这是我要查找的示例-不幸的是,我似乎无法在我的代码中找到循环。structA{boost::shared_ptranC;};structB{boost::shared_ptranA;};structC{boost::shared_ptranB;}; 最佳答案 我建议使用Valgrind.当您关闭进程时,它会显示所有泄漏的内存。除非你的关机以某种方式打破了循环,否则任何循环都应该显示为内存泄漏,Valgrind会告诉你内存最初是从代码中的哪个位置分配的。

c++ - 为什么我不能使用 static_cast<int&> 将整数引用参数传递给 C++ 中的函数?

我在C++程序中有一个枚举参数,我需要使用一个通过参数返回值的函数来获取它。我首先将其声明为int,但在代码审查时被要求将其键入为枚举(ControlSource)。我这样做了,但它破坏了Get()函数——我注意到C风格的转换为int&解决了这个问题,但是当我第一次尝试用static_cast修复它时,它没有编译。为什么会这样,为什么当eTimeSource是一个int时根本不需要强制转换来通过引用传递整数?//GetCuePropertyValuesignatureis(intcueId,intpropertyId,int&value);ControlSourceeTimeSourc

c++ - 是否可以使用 std::unique_ptr 来管理 DLL 资源?

我有很多LoadLibrary在我的项目中,需要调用FreeLibrary手动为每个LoadLibrary.我想使用std::unique_ptr具体deleter让它自动释放我的dll资源。这就是我要定义的:std::unique_ptrtheDll(LoadLibrary("My.dll"),FreeLibrary);但是编译器提示类型不匹配。我发现它期望*HMODULE来自LoadLibrary.即std::unique_ptr会期待A*作为它的指针类型。看起来我仍然需要定义一个新类来管理DLL资源(构造函数中的LoadLibrary和析构函数中的FreeLibrary)。有可能