你能在堆上声明一个指针吗?

12

这是在C++中在堆上创建变量的方法:

T *ptr = new T;

ptr是指向新T的指针,显然。我的问题是,你能这样做吗:

T *ptr = new T*;

这似乎会导致一些非常危险的代码。有没有人知道这是否可行/如何正确使用它?


C++ 在其每个子语言中都非常一致 :) - Khaled Alshaya
虽然你已经得到了展示语法的答案,但迄今为止没有人问你为什么需要这个。对我来说,这肯定是可疑的。 - sbi
1
我觉得这很有趣。我从未考虑过这个问题。我没有需要它(除了可能针对内存消耗优化很少使用的例程)。 - jkeys
3
关于指针,需要认识的关键一点是它们并没有任何特殊性。它们可以像其他任何类型一样进行分配,可以存在于堆、栈、静态变量或其他任何可以使用其他类型的地方。可以创建指向它们的指针或引用。它们只是一种类型。 - jalf
供参考:在堆上创建指针并不能减少内存消耗,反而会增加。虽然你可以在堆上创建指向 int 的指针,但你必须在栈上创建指向指针的指针。 - Georg Fritzsche
5个回答

38
int** ppint = new int*;
*ppint = new int;

delete *ppint;
delete ppint;

7

new T* 返回一个指向 T 类型的指针的指针。因此,声明不正确,应该改为:

T** ptr = new T*;

它将驻留在堆上。


4

提到为什么需要类似这样的东西。想到的是动态数组。(实际上大多数向量实现都使用它。)

// 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

因此,为了增加我们的数组大小,我们复制了一堆指针,而不是对象本身。

4

是的,你可以声明一个指向指针的指针……而且是在堆上分配的。


2

你不能这样做

T *ptr = new T*;

由于new foo的返回类型是"指向foo的指针"或foo *

您可以执行以下操作:

T **ptr = new T*;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接