草庐IT

c++ - std::unique_ptr 是基础对象的两倍大

我遇到了一个问题(特别是MSFTVS10.0的实现)std::unique_ptrs。当我创建它们的std::list时,我使用的内存是创建仅底层对象的std::list时的两倍(注意:这是一个大对象——~200字节,所以它不仅仅是一个周围有额外的引用计数器)。换句话说,如果我运行:std::listX;X.resize(1000,MyObj());我的应用程序需要的内存是我运行时的一半:std::list>X;for(inti=0;i(newMyObj()));我检查了MSFT的实现,但没有发现任何明显的问题——有人遇到过这个问题并有任何想法吗?编辑:好的,更清楚/具体一点。这显然是

c++ - 为什么 std::unique_ptr 没有 operator<<?

C++11标准中的[util.smartptr.shared.io]要求operator为了shared_ptr小号:templatebasic_ostream&operator&os,shared_ptrconst&p);然而,除非我遗漏了它,否则我在[unique.ptr]中看不到任何类似的东西,而且引用en.cppreference.com同意。有没有理由区别? 最佳答案 Isthereareasonforthedifference?不,没有。与make_unique一样,这是一个“疏忽”,应该在将来添加(如果有人愿意发送提案

c++ - std::unique_ptr<T[]> 和自定义分配器删除器

我正在尝试使用std::unique_ptr使用自定义内存分配器。基本上,我有自定义分配器,它们是IAllocator的子类,它提供了以下方法:void*Alloc(size_tsize)templateT*AllocArray(size_tcount)voidFree(void*mem)templatevoidFreeArray(T*arr,size_tcount)由于底层内存可能来自预分配block,因此我需要特殊的...Array()-分配和释放数组的方法,它们分配/释放内存并调用T()/~T()在范围内的每个元素上。现在,据我所知,std::unique_ptr的自定义删除器|

c++ - `std::vector< std::unique_ptr< T >>` 错误

我看到一些错误传递std::vector>周围有std::move.重现问题的代码是这样的:#include//forstd::unique_ptr#include//forstd::move#include//forstd::vectorstructbar{};usingvtype=std::vector>;structfoo{foo(vtypev):_v(std::move(v)){}private:vtype_v;};vtypegetVector(){return{std::move(std::unique_ptr(newbar()))};};intmain(){foof(std

c++ - 在 vector 声明中移动 unique_ptr

这个问题在这里已经有了答案:CanIlist-initializeavectorofmove-onlytype?(8个答案)关闭5年前。我尝试在vector声明期间移动一些unique_ptr,但出现错误。我认为我在不知情的情况下进行了复制。我不明白为什么我在声明时遇到问题,而它在push_back期间工作得很好。我用几行简化了问题。#include#include#includeusingnamespacestd;intmain(){unique_ptri1=make_unique(142);unique_ptri2=make_unique(242);unique_ptri3=mak

c++ - 在 for range 循环中迭代包含 vector 的取消引用的 unique_ptr

为什么这段代码不像我想象的那样工作?for(autoit:*std::make_unique>(std::vector({1,2,3,4,5})))std::coutvector对象在执行循环的第一次迭代之前被销毁 最佳答案 range-basedforloop相当于:{init-statementauto&&__range=range_expression;...}对于您的range_expression,它将是auto&&__range=*std::make_unique>(std::vector({1,2,3,4,5}));但

c++ - 为什么 unique_ptr 析构函数的异常会终止程序?

看看这段代码,它导致程序在未捕获异常的情况下终止。#include#include#include#includeusingnamespacestd;structtest{~test()noexcept(false){throwruntime_error("-my-cool-exception-");}};intmain(){try{autoptr=unique_ptr(newtest());//testt;//thisisok,withoutunique_ptritworksfine.}catch(exception&e){cout这个问题不同于堆栈溢出问题:throwingexce

c++ - 使用 std::unique_ptr 将所有权转移到函数

我正在努力学习如何使用智能指针和理解所有权。当我按值将auto_ptr传递给函数时,该函数获得该指针的独占所有权。因此,当函数完成时,它会删除我传递给它的指针。但是,当我尝试使用unique_ptr执行此操作时出现编译错误,就好像unique_ptr的复制分配被禁用一样。通过引用传递unique_ptr似乎并没有转移所有权,它只是为函数提供了对unique_ptr的引用。如何通过将所有权传递给函数来获得auto_ptr的行为以使用unique_ptr?如果能提供有关unique_ptr的详细教程的链接,我将不胜感激,因为到目前为止,我读过的教程似乎只谈论auto_ptr或谈论Boost

c++ - std::remove_if 来自 std::vector 的多态 std::unique_ptr

我有一个包含三个类的层次结构,其中Derived源自Selectable和Drawable.然后我有一个std::vector的std::unique_ptr我用Derived填充对象。我确定该vector将仅由同时从两个基派生的对象填充。当我尝试使用指向Selected的指针从vector中删除某个元素时,问题就来了.#include#include#includestructSelectable{virtual~Selectable()=0;};Selectable::~Selectable()=default;structDrawable{virtual~Drawable()=0

c++ - 如何将 unique_ptr 的 vector 声明为类数据成员?

我想要一个unique_ptrvector作为我正在创建的类的成员。classFoo{[...]private:vector>barList;}但随后我开始收到来自VS2010编译器的神秘错误消息:errorC2248:'std::unique_ptr::operator=':cannotaccessprivatememberdeclaredinclass'std::unique_ptr'连同下面的一些错误行,这些错误行深入探讨了Microsoft对std::_Copy_impl的实现。...我把成员声明改成了vector>*barList;然后编译。但是我不禁想知道为什么我不能按照我