我是一名尝试学习C++11的C#开发人员。我正在尝试使用windns.h查询DNS。我从DnsQuery()开始,读到我需要使用DnsRecordListFree()释放结果记录输出参数。C#方法可能是使用try-finallyblock来确保我无论如何都释放资源。但我了解到没有finallyblock,并且windns.h确实应该与时俱进并实现RAII兼容接口(interface)(据我了解典型的建议)。我没有等待它发生,而是尝试制作一个RAII包装器类,其析构函数调用DnsRecordListFree()并使用运算符重载转换来获取原始指针。但我对如何正确使用此句柄或指针来获取输出参
我正在为OpenGL实现一个简单的GUI,主要是作为我自己的练习。这个想法是有一个Gui类,其中每个实例都可以分配给不同的渲染目标(例如后台缓冲区或纹理)。GUI元素(小部件)恰好分配给Gui类的一个实例。我想在GUI中存储元素是unique_ptr的典型用例.这是我想出的:classElement{public:Element();virtual~Element();staticstd::unique_ptrcreate_unique();};classGui{public:typedefstd::unique_ptrelement_ptr;Gui();voidaddElement(
我目前正在尝试将std::unique_ptr存储在std::unordered_map中,但出现奇怪的编译错误。相关代码:#pragmaonce#include"Entity.h"#include#includeclassEntityManager{private:typedefstd::unique_ptrEntityPtr;typedefstd::mapEntityMap;EntityMapmap;public:/*AddsanEntity*/voidaddEntity(EntityPtr);/*RemovesanEntitybyitsID*/voidremoveEntity(i
我第一次尝试编写一个基于范围的for循环来遍历unique_ptr时,我写道:std::vector>vec;//Initializevecfor(autov:vec)//error{}然后我意识到这是在尝试创建每个元素的拷贝,这对unique_ptr没有意义。所以后来我写了它作为引用:for(auto&v:vec){}在它前面添加一个const可以防止我更改指针。for(constauto&v:vec){v=nullptr;//error(good!)}要怎么写,才能让指向的数据不能改变?例如,以下代码不应编译。for(???v:vec){v->func();}classFoo{pu
来自http://en.cppreference.com/w/cpp/memory/unique_ptr:IfTisderivedclass(sic)ofsomebaseB,thenstd::unique_ptrisimplicitlyconvertibletostd::unique_ptr.Thedefaultdeleteroftheresultingstd::unique_ptrwilluseoperatordeleteforB,leadingtoundefinedbehaviorunlessthedestructorofBisvirtual.Notethatstd::shared
我正在编写一个类,该类使用两个通过C接口(interface)创建的对象。对象看起来像:typedefstruct...foo_t;foo_t*create_foo(int,double,whatever);voiddelete_foo(foo_t*);(与bar_t类似)。因为C++11,我想将它们包装在一个智能指针中,这样我就不必编写任何特殊方法。该类将拥有这两个对象的唯一所有权,因此unique_ptr在逻辑上是有意义的......但我仍然必须编写一个构造函数:templateusingunique_ptr_deleter=std::unique_ptr;structMyClas
是std::make_unique(1000)总是值初始化元素?好吧,我研究了实现,clang以及g++都在使用newT[size]()进行值初始化。但我找不到符合C++14/17标准的实现必须这样做。 最佳答案 如果标准库符合C++14,那么是的,它必须这样做(使用newT[size])。来自C++14§20.8.1.4[unique.ptr.create]/4:templateunique_ptrmake_unique(size_tn);Returns:unique_ptr(newremove_extent_t[n]()).
下面是代码的极简问题:structB{B()=default;//~B(){};//error:useofdeletedfunction‘B&B::operator=(constB&)’std::unique_ptrm_pB=nullptr;};intmain(){std::vectorvB;vB.erase(vB.begin());}除非取消注释析构函数,否则以上代码可以正常编译。根据我的要求,我需要一个~B()的正文明确定义。如何使用unique_ptr定义析构函数的主体?同类共存?注意:尝试定义=default复制和移动构造函数的版本无济于事。在我的真实代码中,unique_pt
我有以下模板类(精简后只包含相关部分)和一个名为Push的方法用C++11编写:templateclassCircularStack{private:std::array,Capacity>_stack;public:voidPush(std::unique_ptr&&value){//somecodeomittedthatupdatesan_indexmembervariable_stack[_index]=std::move(value);}}我的问题是:ShouldIbeusingstd::moveorstd::forwardwithinPush?我不确定std::unique_
如果像这样初始化一个unique_ptr:std::unique_ptri;i.reset(newFoo());但是Foo::Foo()抛出了一个异常,问题是:分配的内存发生了什么?unique_ptr如何避免被泄露?这是在new运算符中处理的吗?析构函数肯定会在作用域退出时被调用。由于reset调用在newFoo()返回之前不会被调用,看来这必须由new处理,通过释放分配的内存当异常离开构造函数时。是这样吗? 最佳答案 如果在Foo的构造函数中抛出异常,那么唯一指针的reset函数将永远不会首先执行。因此唯一指针保留其原始值。如果