草庐IT

new_capacity

全部标签

c++ - 创建对象 : A. new 还是 new A?

只是出于好奇:为什么C++选择a=newA而不是a=A.new作为实例化对象的方式?后者不是更像是面向对象的吗? 最佳答案 Justoutofcuriosity:WhyC++choosea=newAinsteadofa=A.newasthewaytoinstance-lizeanobject?Doesn'tlatterseemsmorelikemoreobject-oriented?是吗?这取决于您如何定义“面向对象”。如果您定义它,就像Java那样,“一切都必须具有格式为“X.Y”的语法,其中X是一个对象,而Y是你想用那个对象做什

c++ - 为什么Vector的size()和capacity()在push_back()之后不一样

我刚开始学习vector,对size()和capacity()有点困惑我对他们两个都知之甚少。但是为什么在这个程序中两者是不同的呢?甚至array(10)也在为10个元素腾出空间并用0进行初始化。在添加array.push_back(5)之前所以array.size();是10没问题。所以array.capacity();是10没问题。添加array.push_back(5)后所以array.size();是11就可以了(已经添加了10次0然后push_back再添加一个元素5)。所以array.capacity();是15为什么?(是否为一个int保留5个block?)。#inclu

java - java.lang.Object x = new Foo() 的 C++ 等价物是什么?

java.lang.Objectx=newFoo()的C++等价物是什么? 最佳答案 在C++中没有与此等效的东西,尝试在C++中编写Java程序毫无意义。话虽如此,我将从尝试尽可能多地模仿语句的分配特征和精神的角度来处理这个问题。我建议的每种方法都有缺点和局限性。前两个并不是真正地道的C++,但重要的是了解它们以了解后两个解决了哪些问题。1。C风格的空指针。让我从最基本但最没用的空指针开始:void*foo=newFoo();任何东西都可以从new运算符赋值给void指针,因为new、placementnew等总是返回void指针

c++ - 是否正在使用 placement-new,复制存储然后访问值未定义行为?

设S是一个结构类型,它包含一个字符数组data,它具有最大对齐和固定大小。这个想法是S能够存储任何类型T的对象,其大小不超过限制并且是平凡复制构造和平凡可破坏的。staticconstexprstd::size_tMaxSize=16;structS{alignas(alignof(std::max_align_t))chardata[MaxSize];};Placement-new用于构造一个T类型的对象到一个新的S对象的字符数组中。然后该对象被复制任意次数,包括返回和按值传递。templateSwrap(Tt){static_assert(sizeof(T),"");static_

c++ - 无法在带有 Clang 的模块中使用对齐的 `operator new`

我正在试验Clang的“模块”功能,我正在尝试编译以下代码:exportmodulea;#includeexportvoid*foo(){return::operatornew(1,std::align_val_t(1));}exportintmain(){}Tryitlive当我尝试clang++-std=c++2a-pedantic-errors-fmodules-ts--precompile-xc++-modulea.cpp-oa.pcm,我得到了error:ISOC++requiresadefinitioninthistranslationunitforfunction'ope

c++ - 使用 placement new[] 有什么问题?做

考虑下面的程序。它已从一个复杂的案例中简化而来。它无法删除以前分配的内存,除非我删除Obj类中的虚拟析构函数。我不明白为什么程序输出的两个地址不同,只有存在虚拟析构函数时才不同。//GCC4.4#includeusingnamespacestd;classArena{public:void*alloc(size_ts){char*p=newchar[s];cout(p);//theprogramfailshere}};structObj{void*operatornew[](size_ts,Arena&a){returna.alloc(s);}virtual~Obj(){}//ifIr

c++ - 通过在此指针上放置 new 重新初始化对象的未定义行为

我看到了关于PiotrPadlewski的cppcon的介绍。说以下是未定义的行为:inttest(Base*a){intsum=0;sum+=a->foo();sum+=a->foo();returnsum;}intBase::foo(){new(this)Derived;return1;}注意:假设sizeof(Base)==sizeof(Derived)和foo是虚拟的。显然这很糟糕,但我很想知道为什么它是UB。我确实了解UB访问realloced指针,但他说,这是一样的。相关问题:Is`new(this)MyClass();`undefinedbehaviourafterdir

c++ - 为什么替换 malloc() 需要链接器的知识,而::operator new() 不需要?

查看链接的问题。Differencebetweenglobaloperatornewandmalloc接受的答案指出,“替换malloc会引发大量蠕虫。它可以做到,但不可移植,因为它需要链接器的知识。”为什么替换malloc需要链接器的知识,为什么替换::operatornew()不需要? 最佳答案 标准C++对覆盖::operatornew做出了规定。虽然实现肯定是困惑的并且与链接器相关,但C++程序可以只定义一个不同的::operatornew并且它可以工作。C++标准明确表示:程序可以用自己的定义替换这些(等等各种限制和细节)

c++ - 使用可选参数重载 new 和 delete 运算符

#include#include#include#includestructfoo{};inlinevoid*operatornew(size_tsize,foo*)throw(std::bad_alloc){std::cout输出(viaideone):mynew1我的想法是,C++会释放一个带有附加参数的新对象,并匹配删除相同的参数,但我显然是不正确的。让上面的代码调用我的重载删除的正确方法是什么? 最佳答案 当你使用任何形式的placementnew时,除了std::nothrow_t版本,你需要明确地销毁对象并以你认为合适的

c++ - 在 new 表达式中分配内存后是否评估初始值设定项?

考虑代码autop=newT(U(std::move(v)));然后初始化程序是U(std::move(v))。让我们假设T(U(std::move(v)))没有抛出。如果在底层内存分配之后评估初始化程序,则代码是强异常安全的。否则,它不是。如果抛出内存分配,v就会被移动。因此,我对内存分配和初始化程序评估之间的相对顺序很感兴趣。它是已定义的、未指定的还是什么? 最佳答案 是的,初始化是在分配之后计算的。引用C++17(N4659)[expr.new]8.3.4/19:Theinvocationoftheallocationfunc