12

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

T *ptr = new T;

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

T *ptr = new T*;

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

4

5 回答 5

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

delete *ppint;
delete ppint;
于 2009-08-13T20:39:30.413 回答
7

new T*返回一个指向 T 的指针。所以声明不正确,应该是:

T** ptr = new T*;

它将驻留在堆上。

于 2009-08-13T20:41:01.300 回答
4

是的,你可以声明一个指向指针的指针......是的,指针将在堆上。

于 2009-08-13T20:39:57.090 回答
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

结果,我们复制了一堆指针来增加我们的数组,而不是对象本身。

于 2009-08-18T04:43:09.050 回答
2

你不能做

T *ptr = new T*;

因为返回类型new foo是“指向 foo 的指针”或foo *.

你可以做

T **ptr = new T*;
于 2009-08-13T20:41:54.650 回答