草庐IT

c++ - 在 std::set 或 std::map 的键中使用 weak_ptr 是否安全

今天有很多关于std::weak_ptr和std::owner_less以及它们在关联容器std::set和std::map。有许多帖子指出在std::set中使用weak_ptr是不正确的,因为如果弱指针过期,它将是未定义的行为。这是正确的吗? 最佳答案 原因之一std::owner_lessexists是为了提供这种排序,并在存在过期弱指针的情况下保证其安全。我的逻辑是一、std::owner_less的定义operator()definesastrictweakorderingasdefinedin25.4undertheeq

c++ - 如何避免每次构造或重置时都需要为 std::shared_ptr 指定删除器?

std::unique_ptr有两个模板参数,第二个是要使用的删除器。由于这一事实,我们可以很容易地为unique_ptr添加别名。到需要自定义删除器的类型(例如SDL_Texture),方式如下:usingSDL_TexturePtr=unique_ptr;...哪里SDL2PtrDeleter是一个用作删除器的仿函数。有了这个别名,程序员就可以构造和重置SDL_TexturePtr不关心甚至不知道自定义删除器:SDL_TexturePtrptexture(SDL_CreateTexture(/*args*/));//...ptexture.reset(SDL_CreateTextu

c++ - 奇怪的错误:在没有真正创建指针时使用已删除的函数 'std::unique_ptr<_Tp, _Dp>::unique_ptr

我有一个类,看起来像这样:templateusingVectorPtr=std::vector>;templateusingVectorRawPtr=std::vector;classItemsSet{//&items);~ItemsSet()=default;VectorRawPtrGetItems();VectorRawPtrGetSuitableItemsForPeriod(constIPeriod&period);doubleCalculateTotal();private:VectorPtr_items;};构造函数看起来像:ItemsSet::ItemsSet(Vector

c++ - 对 __cxa_end_cleanup' 的 undefined reference

我正在尝试构建一个C++项目,但是当它完成时抛出此错误:undefinedreferenceto__cxa_end_cleanup'使用的工具链是ARMGCC4.7.3,链接器自定义标志是:-mthumb-march=armv6-m-T.\Generated_Source\PSoC4\cm0gcc.ld-g-Wl,-Map,${OutputDir}\${ProjectShortName}.map-specs=nano.specs-Wl,--gc-sections上述错误的一般原因是什么?哪些链接器标志可以解决此错误? 最佳答案 无论

c++ - vector<unique_ptr> 的唯一拷贝

我有一个包含vector的类对象.我想要这个对象的拷贝来运行非常量函数。原始拷贝必须保持const。这样一个类的复制构造函数是什么样的?classFoo{public:Foo(constFoo&other):???{}std::vectorptrs;}; 最佳答案 您不能简单地复制std::vector因为std::unique_ptr不可复制,因此它将删除vector复制构造函数。如果您不更改存储在vector中的类型,那么您可以通过创建一个全新的vector来进行“复制”std::vector>from;//thishasthe

c++ - vsnprintf_s 调用后是否需要 va_end?

MSDN显示vsnprintf_s的示例代码片段://crt_vsnprintf_s.cpp#include#includevoidFormatOutput(LPCSTRformatstring,...){intnSize=0;charbuff[10];memset(buff,0,sizeof(buff));va_listargs;va_start(args,formatstring);nSize=vsnprintf_s(buff,_countof(buff),_TRUNCATE,formatstring,args);printf("nSize:%d,buff:%s\n",nSize,

c++ - union 中的 Shared_ptr

我想访问union的共享指针,尽管发生段错误:structunion_tmp{union_tmp(){}~union_tmp(){}union{inta;std::shared_ptr>ptr;};};intmain(){union_tmpb;std::shared_ptr>tmp(newstd::vector);b.ptr=tmp;//heresegmentationfaulthappensreturn0;}错误的原因是什么,我该如何避免? 最佳答案 您需要在union体中初始化std::shared_ptr:union_tmp(

c++ - 如何从 boost::ptr_vector 中删除元素

所以我试图通过使用boost::ptr_vector摆脱我的std::vector。现在我试图从一个元素中删除一个元素,并删除已删除的元素。对我来说最明显的事情是:classA{intm;};boost::ptr_vectorvec;A*a=newA;vec.push_back(a);vec.erase(a);但这甚至无法编译(完整的错误信息见下文)。我已经像在std::vector上一样尝试了删除/删除习惯用法,但boost::ptr_vector的所有算法结果都与std::vector中的算法略有不同。所以我的问题:如何从ptr_vector中删除指针?我是否还需要手动delete

c++ - 如何转移 boost::ptr_vector 元素的所有权?

#include#includeusingnamespacestd;usingnamespaceboost;structA{~A(){coutv;v.push_back(newA);A*temp=&v.front();v.release(v.begin());deletetemp;return0;}输出:deleted0x300300deleted0x300300c(6832)malloc:***errorforobject0x300300:doublefree 最佳答案 ptr_vector::release返回ptr_vecto

c++ - 如何防止任何人窃取我的 shared_ptr?

因此,我使用boost::shared_ptr来获得它提供的所有各种引用计数优势——显然是初学者的引用计数,还有复制、分配并因此存储在STL容器中的能力。问题是,如果我只将它传递给一个“恶意”函数或对象,该对象可以保存ptr,然后如果外部函数或对象没有很好地放弃其所有权,我将永远无法取消分配它.最终,我尽量明确对象所有权。我通过让所有者保留对象的唯一shared_ptr来实现这一点,而“guest”对象仅将weak_ptr存储到对象。我真的不想要shared_ptr的“共享”部分,但我必须使用shared_ptr才能生成weak_ptr。我想使用scoped_ptr,但它非常有限,因为