這是在C++中創建在堆上一個變量的方法,包括:你可以在堆上聲明一個指針嗎?
T *ptr = new T;
PTR是指一個指針,指向新的T,明顯。我的問題是,你可以這樣做:
T *ptr = new T*;
這似乎是它可以導致一些非常,非常危險的代碼。有誰知道這是可能的/如何正確使用它?
這是在C++中創建在堆上一個變量的方法,包括:你可以在堆上聲明一個指針嗎?
T *ptr = new T;
PTR是指一個指針,指向新的T,明顯。我的問題是,你可以這樣做:
T *ptr = new T*;
這似乎是它可以導致一些非常,非常危險的代碼。有誰知道這是可能的/如何正確使用它?
int** ppint = new int*;
*ppint = new int;
delete *ppint;
delete ppint;
是的,你可以聲明一個指針指針...是的,指針將在堆上。
new T*
返回一個指針的指針到T.所以聲明是不正確的,它應該是:
T** ptr = new T*;
,並且將位於堆上。
你不能這樣做
T *ptr = new T*;
自new foo
返回類型是 「指向FOO」 或foo *
。
你可以做
T **ptr = new T*;
有人提到爲什麼需要這樣的事情。想到的是一個動態數組。 (大多數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
因此,我們拷貝了一堆指針,以增加我們的陣列,而不是對象本身。
C++在每個*子語言中都非常一致* :) – AraK 2009-08-13 20:41:04
儘管您已經有答案顯示語法,但至今沒有人問您爲什麼需要這樣的語法。它肯定對我來說很可疑。 – sbi 2009-08-13 21:53:53
我只是覺得這很有趣。我從來沒有考慮過它。我不需要它(另外,也許,優化很少使用的內存消耗例程)。 – jkeys 2009-08-13 21:57:28