亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么時候在C ++中使用“新”而什么時候不使用?

什么時候在C ++中使用“新”而什么時候不使用?

C++
茅侃侃 2019-10-06 11:01:42
什么時候應該在C ++中使用“ new”運算符?我來自C#/ Java背景,實例化對象使我感到困惑。如果我創建了一個名為“ Point”的簡單類,則在創建點時應該:Point p1 = Point(0,0);要么Point* p1 = new Point(0, 0);有人可以為我澄清何時使用新運算符,什么時候不使用?
查看完整描述

4 回答

?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

new當您希望某個對象一直存在直到您將delete其保留時,應使用它。如果不使用new,則超出范圍時該對象將被銷毀。例如:


void foo()

{

  Point p = Point(0,0);

} // p is now destroyed.


for (...)

{

  Point p = Point(0,0);

} // p is destroyed after each loop

有人會說使用new決定您的對象是在堆上還是在堆棧上,但這僅適用于在函數內聲明的變量。


在下面的示例中,“ p”的位置將是其包含對象Foo的分配位置。我更喜歡稱這種“就地”分配。


class Foo

{


  Point p;

}; // p will be automatically destroyed when foo is.

使用來分配(和釋放)對象new要比就地分配對象昂貴得多,因此應將其使用限制在必要的地方。


何時分配via的第二個示例new是數組。您無法*在運行時更改就地數組或堆棧數組的大小,因此在需要大小不確定的數組時,必須通過new分配它。


例如


void foo(int size)

{

   Point* pointArray = new Point[size];

   ...

   delete [] pointArray;

}

(*先發制人的挑剔-是的,有些擴展允許大小可變的堆棧分配)。


查看完整回答
反對 回復 2019-10-06
?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

看一下這個問題和這個問題,以獲取有關C ++對象實例化的一些好答案。


這個基本思想是,需要手動清理在堆上實例化的對象(使用new),而超出范圍時,將自動清理在堆棧上實例化的對象(沒有new)。


void SomeFunc()

{

    Point p1 = Point(0,0);

} // p1 is automatically freed


void SomeFunc2()

{

    Point *p1 = new Point(0,0);

    delete p1; // p1 is leaked unless it gets deleted

}


查看完整回答
反對 回復 2019-10-06
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

如果要在堆而不是堆棧上創建對象,則應使用new。這允許通過指針從當前函數或過程之外訪問對象。

在C ++中查找指針和內存管理可能對您很有用,因為您不太可能在其他語言中遇到這些問題。


查看完整回答
反對 回復 2019-10-06
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

總是使用New來分配動態內存,然后必須釋放它。


通過執行第一個選項,當范圍丟失時,該內存將自動釋放。


Point p1 = Point(0,0); //This is if you want to be safe and don't want to keep the memory outside this function.


Point* p2 = new Point(0, 0); //This must be freed manually. with...

delete p2;


查看完整回答
反對 回復 2019-10-06
  • 4 回答
  • 0 關注
  • 517 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號