Ես ունեմ հետևյալ հայտարարությունը.
void * operator new (size_t s, PersistentMemory * m) throw()
{return m->allocatePersistentMemory(s);}
Ես փորձարկում եմ հիշողության սպառումը գործարկման ժամանակ, ինչի արդյունքում m->allocatePersistentMemory(s);
-ը վերադարձնում է 0: Նորը, այնուհետև կանչում է կոնստրուկտորին՝ զրոյական ցուցիչով this
-ի համար:
Այնուամենայնիվ, C++ 2003 ստանդարտի 3.7.3.1 պարբերության 3-ի հիման վրա.
Բաշխման ֆունկցիան, որը չի կարողանում տեղաբաշխել պահեստը, կարող է կանչել ներկայումս տեղադրված new_handler-ը (18.4.2.2), եթե այդպիսիք կա: [Նշում. Ծրագրի կողմից տրամադրված հատկացման ֆունկցիան կարող է ստանալ ներկայումս տեղադրված new_handler-ի հասցեն՝ օգտագործելով set_new_handler ֆունկցիան (18.4.2.3): ] Եթե հատկացման ֆունկցիան, որը հայտարարված է դատարկ բացառության (15.4) հատկորոշմամբ, throw(), չի կարողանում տեղաբաշխել պահեստը, այն պետք է վերադարձնի զրոյական ցուցիչ: Բաշխման ցանկացած այլ ֆունկցիա, որը չի կարողանում տեղաբաշխել պահեստը, պետք է ցույց տա միայն խափանումը՝ բացառելով std::bad_alloc (18.4.2.1) դասից կամ std::bad_alloc-ից ստացված դասից:
Ես հասկանում եմ այն, որ m->allocatePersistentMemory(s)
վերադարձնելը null պետք է հանգեցնի նրան, որ ամբողջ operator new() throw()
-ը վերադարձնի null՝ առանց կոնստրուկտորին կանչելու: Արդյո՞ք ես բացակայում եմ որևէ այլ պայման, որը գերակայում է սա:
Շնորհակալություն
operator new (size_t s, PersistentMemory * m) throw();
չկա: չնայած շնորհակալություն :) 17.07.2012new
օպերատոր է կանչվել: Տեղակայումըnew
, կամnew[]
նույնպես պետք է ստուգվի: 17.07.2012