簡體   English   中英

指針問題是c ++中的“new”運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM