回答
Both:你創建了一個A
(一個對象)的新實例,並創建了一個指向它的指針a
。
你可以將其分成兩個語句:
A *a; // Declare `a` of type: pointer to `A`
a = new A(); // create a new instance of `A` and
// assign the resulting pointer to `a`
這會在堆上創建一個類型爲A
的對象,並在a
(存儲在堆棧中)中存儲一個指向它的指針。
P.S.當你完成它時,不要忘記撥打delete a
,以便A
可以被銷燬,並將其內存返回堆中。更好的是,將a
變成智能指針。
我希望你不要介意這個微小的編輯來澄清'a'的存儲位置。 – 2013-04-20 06:21:47
如果A類的構造函數不是異常保存,那麼該怎麼辦?然後可以引發異常並且不會創建實例,在這種情況下調用delete之後,您將收到運行時錯誤。 – 2013-04-20 06:22:16
更像是不要忘記使用智能指針,而不必擔心安全刪除它。 – chris 2013-04-20 06:28:41
這既創造。
它在堆上創建類型爲A*
的對象,並在堆上創建類型爲A
的對象。
相當於
A *a;
a = new A();
這將創建兩個對象,以及指針。
Firstlly新的A()被調用,如果您有默認的構造函數然後調用構造函數和初始化缺省值對象,否則它會與defaul初始化values.Because我們使用新keywork那麼它將分配內存爲堆上的對象A. New
關鍵字用於在堆上動態分配內存。 NEW
返回對象的起始地址。
之後一個類型指針,它將具有由new
運算符返回的對象A()的地址。
正如其他人所說,它創建兩個。但對象A是在免費商店中創建的,現在您必須記住要手動將它delete
。請記住,C++中的任何函數都可以拋出異常,除非聲明爲noexcept
。因此,現在不僅需要記住delete
,而且不會拋出任何異常,您現在還需要想象代碼可能採用的所有路徑,並編寫適當的try-catch
塊,以便手動將delete
作爲對象。
你在做什麼被稱爲裸體新的,這是一個簡單的方法來拍攝自己的腳。
謝天謝地,C++ 11解決了這個問題:智能指針。考慮你的指針的語義,它將由一個實體擁有還是在幾個實體之間共享?在前一種情況下,你需要std::unique_ptr
:
#include <memory>
std::unique_ptr<A> a(new A{});
現在你不需要調用delete
,內存管理已經採取爲你照顧。在後一種情況下,你需要std::shared_ptr
#include <memory>
std::shared_ptr<A> a(new A{});
但在C++序列點的定義並不能保證創建智能指針的這種方式永遠是安全的,沒有進入細節:
std::shared_ptr<A>(new A{new B, new C});
可能產生內存泄漏,爲了避免這種情況,使用std::make_shared
#include <memory>
auto a = std::make_shared<A>(); // a now holds a shared_ptr to A
不幸的是,最後確定C++ 11時,委員會忘了std::make_unique
。這應該在C++ 14中修復:
#include <memory>
auto a = std::make_unique<A>(); // a now holds a unique_ptr to A
一個對象和指針。該對象必須有一個指針供您參考,但是,您可以通過多個指針指向一個對象。
- 1. 在A a = new A()之後真的創建了一個實例嗎?
- 2. 哪個更好,a = []或a = new Array()?
- 3. A * pA = new A之間的區別;和A * pA = new A();
- 4. 如何給A或Promise [A]返回一個Promise [A]?
- 5. 下一個方法的術語名稱是什麼:A a = new A {Prop1 = a,Prop2 = b};
- 6. 如何創建一個<a href=> to facebook and share a message?
- 7. 傳入A :: operator new()的尺寸是否總是等於sizeof(A)?
- 8. 如果(A = NULL &&一個的instanceof一個!)...或者,如果(一個的instanceof A)
- 9. 刪除第一個$ HOME/a/a/b/c
- 10. 從IO a - > a寫一個函數?
- 11. a =和* A在C++中的含義是什麼(其中A是指針)?
- 12. 測試非整數是否在範圍[a,b) - 或[a,b],(a,b),(a,b)
- 13. Scipy稀疏矩陣求冪:a ** 16比a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a *
- 14. 如何在JavaScript的A函數或類中創建對象A的實例?
- 15. 哪些措施來簡化這個(A + B)(A +!B)=一
- 16. 'a ++&f(a)`未定義或未指定?
- 17. 計算一個以A或a開頭的單詞的時間
- 18. 什麼是後{a = 5; A = A ++; Syso(a);}
- 19. 獲取型積分一個的值=>並[a]從一個積分的值=>([A],[A],[A])
- 20. 從模型A編輯對象時從模型B創建一個對象?
- 21. Neon指令,vsub_f32(a,b),是a-b還是b-a?
- 22. 建設<a></a>當用戶輸入一個URL
- 23. 構建一個QueryExpression,其中名稱字段是A或B
- 24. 正則表達式(A或A或A和B),(A但不是B)
- 25. 當JVM加載類A時,或者當我調用A.class時,是否創建了Class對象A?
- 26. 如果A == B,這是否意味着[A isEqual:B]是真的?
- 27. 這是什麼意思?公式一=> A - > [A] - >布爾
- 28. a ++和++ a或a--和--a在java中有什麼區別?
- 29. 創建一個List(String)給出錯誤「Object reference not set to a instance of a object。」
- 30. 「int * a = new int」和「int * a = new int()」有什麼區別?
如果它只創建一個指針,那個指針指向的是什麼? – Mat 2013-04-20 06:17:51
當你購買一個新房子時,你有沒有獲得一個新的街道地址或新房子? – Mehrdad 2013-04-20 06:18:52
指針也是一個對象本身。 – Nawaz 2013-04-20 13:07:32