草庐IT

new_order

全部标签

c++ - `new (std::nothrow)`是如何实现的?

我有一个C++程序,其中重载了new运算符。问题是如果我在new运算符中的分配失败,我仍然会调用构造函数。我知道我可以通过抛出std::bad_alloc来避免这种情况,但我不想那样做。我怎样才能在重载的new运算符中失败并且仍然不调用我的构造函数?本质上,我想实现类似new(std::nothrow)的东西。这里有一个例子来说明我的意思。请注意我正在测试的系统on没有内存保护。所以访问NULL不会做任何事情示例1:重载新运算符#include#include#includeclassTest{public:Test(void){printf("Testconstructor\n");

c++ - 如何为多个堆重载 new 运算符?

在具有两个独立RAM内存区域的嵌入式系统中,我有两个不同的堆(一个是FreeRTOS在较低内存区域中的自定义实现,另一个是由GCC在较高内存区域中生成的堆)我想能够选择新使用的堆。 最佳答案 您可以提供一个operatornew重载,它接受第二个参数,告诉它从哪个内存区域分配内存。您可以将参数放在operatornew中,方法是将参数放在new表达式中类型之前的括号中。这通常用于将对象new到已分配的存储中(因为这是标准库提供的重载),但是任何东西都可以传递到那里,并将传递给operatornew。enumMemoryArea{LO

c++ - 为什么销毁被 placement new 覆盖的对象不是未定义的行为?

我想弄清楚以下是否是未定义的行为。我感觉它不是UB,但我对标准的阅读使它看起来像是UB:#includestructA{A(){std::cout引用C++11标准:basic.life¶4说“程序可以通过重用对象占用的存储来结束任何对象的生命周期”所以在new(&a)A之后,原来的A对象已经结束了它的生命周期。class.dtor¶11.3说“当创建对象的block退出([stmt.dcl])时,为具有自动存储持续时间([basic.stc.auto])的构造对象隐式调用析构函数”因此当main退出时,原始A对象的析构函数被隐式调用。class.dtor¶15表示“如果为生命周期已结

C++ -- "throw new BadConversion("xxx")"and "throw BadConversion ("xxx")"之间的区别

//http://www.parashift.com/c++-faq-lite/misc-technical-issues.htmlclassBadConversion:publicstd::runtime_error{public:BadConversion(std::stringconst&s):std::runtime_error(s){}};inlinestd::stringstringify(doublex){std::ostringstreamo;if(!(o[Q1]当我们在函数中抛出异常时,thrownewClassName()和throwClassName()有什么区别

c++ - 是否可以使用 operator new 和 initialiser 语法初始化非 POD 数组?

我刚刚阅读并理解IsitpossibletoinitialiseanarrayinC++11byusingnewoperator,但这并不能完全解决我的问题。这段代码在Clang中给我一个编译错误:structA{A(intfirst,intsecond){}};voidmyFunc(){newA[1]{{1,2}};}我希望{{1,2}}用单个元素初始化数组,然后用构造函数参数{1,2}初始化,但我得到这个错误:error:nomatchingconstructorforinitializationof'A'newA[1]{{1,2}};^note:candidateconstruc

C++:如何使用 new 来查找函数返回值的存储?

我正在阅读BjarneStroustrup所著的TheC++ProgrammingLanguage第3版,并试图完成所有练习。我不确定如何完成6.6节中的练习13,所以我想我应该求助于StackOverflow以获得一些见解。这是问题的描述:Writeafunctioncat()thattakestwoC-stylestringargumentsandreturnsasinglestringthatistheconcatenationofthearguments.Usenewtofindstorefortheresult.到目前为止,这是我的代码,在我不确定要做什么的地方带有问号:?c

c++ - int *pi = new int(0); 中 int(0) 的含义?

int*pi=newint(0);这里的0有什么意义?是不是表示长度为0的整数数组? 最佳答案 它是一个初始化器(构造函数参数)。新创建的int的值为0。 关于c++-int*pi=newint(0);中int(0)的含义?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/3056309/

c++ - 使用 new 运算符在不知道对象类型的情况下将对象复制到堆

我有疑问,下面的函数可以接收类型A或派生类型的对象。A*copyToHeap(A&obj){A*ptr=newA(obj);returnptr;}如果我们这样调用它://BinheritsfromABbObj;B*hPtr=copyToHeap(bObj);hPtr指向的对象到底是A型还是B型?这样做安全吗? 最佳答案 当您在代码中执行以下操作时:A*ptr=newA(obj);您将始终获得一个A实例。obj将被视为A,并且将根据obj的“A部分”创建新的A。更好的方法是如先前的回复所示,将虚拟MakeCopy方法添加到基类并为派生

c++ - "new"运算符和 "new"函数之间的区别

这个问题在这里已经有了答案:Differencebetween'newoperator'and'operatornew'?(8个答案)关闭8年前。面试题:"new"运算符和"new"函数有什么区别?我回答没有区别,他们运行相同的代码,但面试官一直在挑刺我,好像那是错误的答案。这是错误的答案吗?还是面试官在耍我?如果答案是错误的,那么正确答案是什么?我继续说,如果您需要自定义分配,可以重载"new"运算符,但后来他想知道如何重载它。当然我没有那个答案,从来没有需要,但我告诉他我可以在10分钟内查到(这在面试中永远不是正确的答案)。所以无论如何,在对"new"运算符与"new"函数进行了一

c++ - 为什么允许 new 运算符将 *void 返回给每个指针类型?

在C++中,不允许在没有显式转换的情况下将void*指针分配给任何整型指针。这需要使用static_cast。但是这是怎么回事:int*iptr=newint;我知道new运算符定义如下:void*operatornew(size_t);C++如何处理这个问题?我知道这是一个基本问题,但很重要。我也知道低级代码必须使用void。但是这个赋值怎么可能合法呢?iptr是一个指向int的指针,new返回一个指向void的指针,这应该会触发一条消息,如“错误:从‘void*’到‘int*’的无效转换[-fpermissive]”。 最佳答案