你可以声明在堆上的指针?
-
16-09-2019 - |
题
这是用于在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*;
和它将驻留在堆上。
是的,你可以声明一个指针的指针...是的,指针会在堆上。
有人提到为什么需要这样的事情。浮现在脑海的事情是一个动态数组。 (大多数矢量实现实际使用此。)
// 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
其结果是,我们复制一堆指针增加我们数组,而不是对象本身。
您不能做
T *ptr = new T*;
因为new foo
的返回类型是 “指针foo” 的或foo *
。
您可以做
T **ptr = new T*;
不隶属于 StackOverflow