草庐IT

new_elem

全部标签

c++ - c++ 中表达式 new (&t) T(t) 的 &t 是什么意思?

C++中表达式new(&t)T(t)的&t是什么意思?如题。Tt;new(&t)T(t); 最佳答案 这被称为“placementnew”语法。T值在&t指定的地址中构造。此示例有点偏离,因为它使用复制构造函数在现有T的确切位置创建新T。我认为用一个明确的地址来解释这个概念更容易。这是此代码的变体。Tt;void*pAddress=malloc(sizeof(T));new(pAddress)T(t);//OrjustcreatingaTwithoutacopyctornew(pAddress)T();

c++ - 如果类有析构函数/delete[],则成员运算符 new[] 的参数 "size"增加

以下代码中的4个类:A、B、C和D。他们都有一个成员operatornew[]。此外,B有一个构造函数;C有析构函数;D有一个成员operatordelete[]。输出成员operatornew[]的参数size和4个类的sizeof:new[]A40new[]B40new[]C48new[]D48sizeof(A)4sizeof(B)4sizeof(C)4sizeof(D)4大小不同的原因是什么?代码(我知道很丑):#includeusingnamespacestd;classA{inti;public:staticvoid*operatornew[](std::size_tsize

c++ - 使用哪个 - "operator new"或 "operator new[]"- 在 C++ 中分配一 block 原始内存?

我的C++程序需要一block未初始化的内存和一个指向该block的void*指针,以便我可以将其提供给第三方库。我想将block生命周期的控制权交给库,所以我不想使用std::vector。当库完成block时,它将调用我必须提供的回调,这将释放block。在C语言中,我会使用malloc()和后来的free()。在C++中,我可以调用::operatornew或::operatornew[]和::operatordelete或operatordelete[]之后分别为:void*newBlock=::operatornew(sizeOfBlock);//then,later::op

C++ 重载 new[] 查询 : What size does it take as parameter?

我像这样重载了operatornew[]void*human::operatornew[](unsignedlongintcount){cout现在打电话human*h=newhuman[14];说sizeof(human)=16,但计算它打印出来的是232,也就是14*16+sizeof(int*)=224+8。为什么要分配这个额外的空间?它落在内存中的什么地方?因为当我打印*h或h[0]我得到相同的结果,所以它不在内存块的开头。它是否完全正确,或者我在这里遗漏了一些东西? 最佳答案 分配的额外空间用于存储内部使用的数组大小(在实

C++ 删除了 new 运算符但可以创建 shared_ptr

我试图寻找答案,但找不到任何有助于理解幕后发生的事情。假设我们有以下内容:classBase{public:virtualintrequest()=0;void*operatornew(longunsignedintsize)=delete;};classDerivedfinal:publicBase{public:intrequest()override;};intDerived::request(){return2;}在基类上,我删除了new运算符,因为我不想创建指针。我知道这可能没有任何意义,这只是一个实验。当我调用g++时,出现编译错误,告诉我新运算符已被删除。正是我所期望的。

c++ - operator new(n) 与 new unsigned char[n] 用于放置 new

我正在分配内存,稍后将用于构造具有放置new的对象。我应该使用operatornew(n),还是应该使用newunsignedchar[n]?为什么? 最佳答案 因素:new[]必须与delete[]/new()与delete匹配他们交流不同的东西。operatornew(n)是出于未指定目的的内存请求,而newunsignedchar[n]松散地暗示有意将字符存储在那里。数组形式可能稍微性能/效率较差-具体细节取决于您的实现:5.3.4/12newT[5]resultsinacallofoperatornewwherexisano

c++ - new[] 是否连续分配内存?

当我使用new[]关键字(或new-operator)时,它是否连续分配内存?int*arr=newint[10];我的意思是,是否可以保证arr[0]和arr[1]位置很近,并且我可以遍历arr使用指针增量?如果是这样,这种行为是否使用结构和类而不是int来保存? 最佳答案 C++标准绝对保证了这一点。arr[0]到arr[9]是连续的,元素之间不允许填充。指针算法在分配的区域中有效。您可以设置指向arr+10的指针,但不要取消引用它。这适用于任何类。每个元素分配的内存量是sizeof(Y),其中Y是类或普通旧数据类型。

c++ - std::allocator 构造/销毁与放置 new/p->~T()

对于我的一个项目,我正在从头开始编写一些STL容器(我有我的理由)。由于我非常接近地模仿STL的功能和接口(interface),所以我会尽最大努力遵守“如果它与标准结构同名,它将尽可能符合标准”的政策。所以,当然我的容器将分配器作为模板参数,这非常好,因为它允许一些自定义分配方案。关于我的问题。std::allocator接口(interface)将内存分配与对象构造分开。同样,它将释放与销毁分开。这是有道理的,因为从哪里获取内存与在C++中正确构造对象或多或少无关。所以有两个构造/释放函数,默认实现如下所示(直接从书中摘录):voidconstruct(pointerp,const

c++ - "x = new(Foo)"与任意 Foo 的 "x = new Foo"相同吗?

我正在查看一些遗留代码并遇到了x=new(Foo);(请注意提供的类型周围的括号)。我测试了变体,它似乎与x=newFoo;相同Foo是一个非POD数据结构。某些外部内存泄漏程序正在标记该行-它正在为CORBA输出参数分配内存,因此调用者应该负责删除,但这是一个包含许多间接层的单独问题。我的分析是否正确,是可以接受的风格吗? 最佳答案 这是正确的,但至少风格不寻常。有时允许在完整的类型名称周围使用括号,但在这种情况下是无关紧要的。这就像在不需要的表达式周围加上括号。也许最接近的类比是return(0);/*lookslikeafun

c++ - 在 C++ 中重载全局运算符 new/delete

我正在尝试为性能敏感的应用程序重载全局运算符new和delete。我已阅读http://www.informit.com/articles/article.aspx?p=30642&seqNum=3中描述的问题以及使用英特尔TBB分配器的建议http://www.intel.com/technology/itj/2007/v11i4/5-foundations/5-memory.htm由于我是第一次重载new和delete,所以我有几个问题。我是否应该在包含"new"调用的所有文件中包含包含重载新函数的新headerAllocator.h(或Pre.h)?这很乏味。或者我应该使用“gc