2009-08-13 101 views
9

這是在C++中創建在堆上一個變量的方法,包括:你可以在堆上聲明一個指針嗎?

T *ptr = new T; 

PTR是指一個指針,指向新的T,明顯。我的問題是,你可以這樣做:

T *ptr = new T*; 

這似乎是它可以導致一些非常,非常危險的代碼。有誰知道這是可能的/如何正確使用它?

+0

C++在每個*子語言中都非常一致* :) – AraK 2009-08-13 20:41:04

+0

儘管您已經有答案顯示語法,但至今沒有人問您爲什麼需要這樣的語法。它肯定對我來說很可疑。 – sbi 2009-08-13 21:53:53

+1

我只是覺得這很有趣。我從來沒有考慮過它。我不需要它(另外,也許,優化很少使用的內存消耗例程)。 – jkeys 2009-08-13 21:57:28

回答

33
int** ppint = new int*; 
*ppint = new int; 

delete *ppint; 
delete ppint; 
4

是的,你可以聲明一個指針指針...是的,指針將在堆上。

7

new T*返回一個指針的指針到T.所以聲明是不正確的,它應該是:

T** ptr = new T*; 

,並且將位於堆上。

2

你不能這樣做

T *ptr = new T*; 

new foo返回類型是 「指向FOO」 或foo *

你可以做

T **ptr = new T*; 
3

有人提到爲什麼需要這樣的事情。想到的是一個動態數組。 (大多數vector實現實際使用此。)

// Create array of pointers to object 
int start = 10; 
SomeObject** dynamic = new SomeObject*[start]; 
// stuff happens and it gets filled 
// we need it to be bigger 
{ 
    SomeObject** tmp = new SomeObject*[start * 2]; 
    for (size_t x = 0; x < start; ++x) 
     tmp[x] = dynamic[x]; 
    delete [] dynamic; 
    dynamic = tmp; 
} 
// now our dynamic array is twice the size 

因此,我們拷貝了一堆指針,以增加我們的陣列,而不是對象本身。

相關問題