2009-08-13 59 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 

因此,我们拷贝了一堆指针,以增加我们的阵列,而不是对象本身。

相关问题