[英]the “new” operator in c++, pointer question
愚蠢的問題,但每當你打電話給新的時,你總是有指針嗎?
SomeClass *person = new SomeClass();
那是因為你需要一個指向指向為SomeClass變量人分配的新內存空間的指針嗎? 謝謝!
如果new
成功完成,它總是返回一個指針(如果它沒有成功完成,則拋出異常,並且不返回任何內容)。
指針指向已創建的對象,如果是數組,指針指向數組的第一個元素。
是的,總是指針。 即使您想要重載new ,返回類型也必須為void * 。
而且你的目的是正確的
new在堆上創建一個對象,它可以返回的是它的地址 - 一個指針。
是。 如果你問為什么它沒有返回引用,因為引用比指針更好,答案是歷史遺產。
當C ++處於開發階段時,如果機器無法為對象獲取內存,則返回一個特殊的指針NULL
。 這是在C中完成的:
SomeClass *person;
person = (SomeClass*) malloc( sizeof( SomeClass ) );
if ( person == NULL ) fprintf( stderr, "no more people allowed!" );
在標准C ++中,異常返回錯誤:
try {
SomeClass *person = new SomeClass;
// do something
} catch ( std::bad_alloc ) {
std::cerr << "no more people!" << std::endl;
} catch ( ... ) {
// using exceptions allows for other errors
// from inside SomeClass::SomeClass too
}
你仍然可以做到這一點的老式的方式,雖然與nothrow
:
SomeClass *person = new( std::nothrow ) SomeClass;
if ( person == NULL ) std::cerr << "no more people allowed!" << std::endl;
結果是,這是完全合理和良好的風格:
SomeClass &person = * new SomeClass; // don't need no stinkin pointers!
新表達式返回一個指針,但您可以將它與“智能指針”類(例如來自Boost )一起使用。 所以:
boost::shared_ptr<SomePerson> person(new SomePerson);
我還應該指出,雖然如果你來自Java背景,在C ++中你可能習慣使用括號,但在使用默認構造函數時不需要使用括號。 因此,例如,在默認構造時,通常會寫入new T
,但是在使用非默認構造函數構造對象時,會寫入new T(param)
或new T(param1,...,paramN)
。
對,那是正確的; 從理論上講,可以寫(new SomePerson) - > doSomething(),但那會是內存泄漏; C ++沒有垃圾收集,因此有必要將新表達式的結果存儲在某些東西(指針或智能指針)中,以便可以正確地釋放它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.