2013-04-20 57 views
21
A *a = new A(); 

這是否會創建一個指針或對象?A * a = new A();這是否創建一個指針或一個對象?

我是一名C++初學者,所以我想了解這種差異。

+10

如果它只創建一個指針,那個指針指向的是什麼? – Mat 2013-04-20 06:17:51

+49

當你購買一個新房子時,你有沒有獲得一個新的街道地址或新房子? – Mehrdad 2013-04-20 06:18:52

+2

指針也是一個對象本身。 – Nawaz 2013-04-20 13:07:32

回答

44

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` 
15

這會在堆上創建一個類型爲A的對象,並在a(存儲在堆棧中)中存儲一個指向它的指針。

P.S.當你完成它時,不要忘記撥打delete a,以便A可以被銷燬,並將其內存返回堆中。更好的是,將a變成智能指針。

+0

我希望你不要介意這個微小的編輯來澄清'a'的存儲位置。 – 2013-04-20 06:21:47

+0

如果A類的構造函數不是異常保存,那麼該怎麼辦?然後可以引發異常並且不會創建實例,在這種情況下調用delete之後,您將收到運行時錯誤。 – 2013-04-20 06:22:16

+7

更像是不要忘記使用智能指針,而不必擔心安全刪除它。 – chris 2013-04-20 06:28:41

11

這既創造。
它在堆上創建類型爲A*的對象,並在堆上創建類型爲A的對象。

相當於

A *a; 
a = new A(); 
4

這將創建兩個對象,以及指針。


Firstlly新的A()被調用,如果您有默認的構造函數然後調用構造函數和初始化缺省值對象,否則它會與defaul初始化values.Because我們使用新keywork那麼它將分配內存爲堆上的對象A. New關鍵字用於在堆上動態分配內存。 NEW返回對象的起始地址。

之後一個類型指針,它將具有由new運算符返回的對象A()的地址。

1

它創建了兩者。

首先創建一個類的對象,然後存儲一個指向它

欲瞭解更多信息,請指針來看看here

3

正如其他人所說,它創建兩個。但對象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 
0

一個對象和指針。該對象必須有一個指針供您參考,但是,您可以通過多個指針指向一個對象。

相關問題