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

C++ 你能在堆上声明一个指针吗?,c++,dynamic-memory-allocation,heap-memory,C++,Dynamic Memory Allocation,Heap Memory,这是在C++中在堆上创建变量的方法: T *ptr = new T; 显然,ptr指的是指向新T的指针。我的问题是,你能做到这一点吗: T *ptr = new T*; 这似乎会导致一些非常非常危险的代码。有人知道这是否可行/如何正确使用它吗?是的,您可以声明指向指针的指针。。。是的,指针将位于堆上。new T*返回指向T的指针的指针。因此声明不正确,应该是: int** ppint = new int*; *ppint = new int; delete *ppint; delete p

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

T *ptr = new T;
显然,ptr指的是指向新T的指针。我的问题是,你能做到这一点吗:

T *ptr = new T*;

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

是的,您可以声明指向指针的指针。。。是的,指针将位于堆上。

new T*
返回指向T的指针的指针。因此声明不正确,应该是:

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

delete *ppint;
delete ppint;
T** ptr = new T*;
它将驻留在堆上。

您不能这样做

T *ptr = new T*;
因为
newfoo
的返回类型是“指向foo的指针”或
foo*

你能行

T **ptr = new T*;

有人提到为什么你可能需要这样的东西。我想到的是一个动态数组。(大多数向量实现实际上都使用这种方法。)

//创建指向对象的指针数组
int start=10;
SomeObject**dynamic=新建SomeObject*[start];
//事情发生了,它被填满了
//我们需要更大一点
{
SomeObject**tmp=新的SomeObject*[start*2];
用于(大小x=0;x

因此,我们复制一堆指针来增加数组,而不是对象本身

C++在它的每一个子语言中都是非常一致的:)虽然你已经得到了显示语法的答案,但到目前为止没有人问你为什么需要这个。对我来说,这确实很可疑。我只是觉得这很有趣。我从来没有考虑过。我不需要它(除此之外,也许还需要为内存消耗优化很少使用的例程)。要了解指针的一个关键点是,指针绝对没有什么特别之处。它们是可以像任何其他类型一样进行分配的类型。它们可以存在于堆上、堆栈上、作为静态变量或任何其他类型的对象。您可以创建指向它们的指针或引用。它们只是类型。仅供参考:在堆上创建指针不会减少内存消耗,而是会增加内存消耗。虽然可以在堆上创建指向int的指针,但必须在堆栈上创建指向该指针的指针。
// 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