这是在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