草庐IT

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

c++ - 当使用 malloc 而不是 new 时,类成员会发生什么情况?

我正在为期末考试学习,我偶然发现了一个奇怪的问题,这是我们老师去年给一些可怜的人的考试的一部分。问题是这样的:Isthefollowingprogramcorrect,ornot?Ifitis,writedownwhattheprogramoutputs.Ifit'snot,writedownwhy.程序:#includeclasscls{intx;public:cls(){x=23;}intget_x(){returnx;}};intmain(){cls*p1,*p2;p1=newcls;p2=(cls*)malloc(sizeof(cls));intx=p1->get_x()+p2

c++ - 为什么虚拟函数在分配给 'new' 时不能未实现?

structA{virtualvoidfoo();//unusedandunimplementedvirtualvoidbar(){}};intmain(){Aobj;//okobj.bar();//对于堆栈上的对象itworksfine.但是对于使用new(不是malloc)在堆上分配,它会给出链接器错误:undefinedreferenceto`vtableforA' 最佳答案 因为malloc不调用(或在这种情况下尝试调用)A的构造函数,而new调用。此代码编译并记录GCC链接器错误发生的位置:#includestructA{

c++ - "int *a = new int"和 "int *a = new int()"有什么区别?

这个问题在这里已经有了答案:Dotheparenthesesafterthetypenamemakeadifferencewithnew?(7个答案)关闭9年前。下面两行有什么区别?int*a=newint;int*a=newint();

c++ - char 数组作为 placement new 的存储

以下是否具有明确定义的行为的合法C++?classmy_class{...};intmain(){charstorage[sizeof(my_class)];new((void*)storage)my_class();}或者由于指针转换/对齐方面的考虑,这是有问题的吗? 最佳答案 是的,这是有问题的。您根本无法保证内存正确对齐。虽然存在各种技巧来获得正确对齐的存储,但您最好使用Boost或C++0x的aligned_storage,它们对您隐藏了这些技巧。那么你只需要://C++0xtypedefstd::aligned_stora

c++ - 在 C++11 中,如何调用 new 并为对象预留足够的内存?

我有一个这样描述的类:classFoo{intsize;intdata[0];public:Foo(int_size,int*_data):size(_size){for(inti=0;i我无法更改该类的设计。如何创建该类的实例?在调用构造函数之前,我必须让它预留足够的内存来存储它的数据,所以它必须在堆上,而不是在栈上。我想我想要类似的东西Foo*place=static_cast(malloc(sizeof(int)+sizeof(int)*size));*place=newFoo(size,data);//Imean:"usethememoryallocatedinplacetod

c++ - 为什么 C++ 编译器不消除 new 返回的指针的空检查?

最近我在ideone.com(gcc-4.3.4)上运行了以下代码#include#include#include#includeusingnamespacestd;void*operatornew(size_tsize)throw(std::bad_alloc){void*ptr=malloc(2*1024*1024*1024);printf("%p\n",ptr);returnptr;}voidoperatordelete(void*ptr){free(ptr);}intmain(){char*ptr=newchar;if(ptr==0){printf("unreachable\n

c++ - 除了分配和 ctor 调用之外,C++ new 运算符还做什么?

除了分配内存和调用构造函数之外,new运算符还做了哪些其他事情? 最佳答案 C++标准对来自的new运算符的单个对象形式(通常使用的形式)有这样的说法。header:Requiredbehavior:Returnanonnullpointertosuitablyalignedstorage(3.7.3),orelsethrowabad_allocexception.Thisrequirementisbindingonareplacementversionofthisfunction.Defaultbehavior:—Executes

c++ - 我可以告诉在 C++ 中使用 "new type[n]"创建的数组的大小吗?

使用C++11,我喜欢创建一个bool数组并立即清除它bool*mymap=newbool[n];n是可变的。现在,这是否已经清除了数组占用的内存?如果不是,是否有比对所有元素使用循环并将每个元素分别设置为false更好的方法来清除数组?我考虑过使用std:memset(),但这需要我知道数组的大小。现在,初学者可能会说:简单,大小是n*sizeof(bool)。但我不买那个。编译器可能决定以不同方式打包它们,甚至将它们打包为位,不是吗?那么,有没有办法更清楚地告诉数组的大小呢?我想可能有一个std:arraysize()函数,它只返回内存中分配的数组的空间。毕竟,必须以某种方式在运行