代码之家  ›  专栏  ›  技术社区  ›  jkeys

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

  •  11
  • jkeys  · 技术社区  · 15 年前

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

    T *ptr = new T;
    

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

    T *ptr = new T*;
    

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

    5 回复  |  直到 15 年前
        1
  •  35
  •   Khaled Alshaya    15 年前
    int** ppint = new int*;
    *ppint = new int;
    
    delete *ppint;
    delete ppint;
    
        2
  •  7
  •   Tamás Szelei    15 年前

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

    T** ptr = new T*;
    

    它将驻留在堆中。

        3
  •  4
  •   jsight TaherT    15 年前

    是的,您可以声明指向指针的指针…是的,指针将在堆上。

        4
  •  3
  •   Zeroshade    15 年前

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

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

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

        5
  •  2
  •   David Thornley    15 年前

    你做不到

    T *ptr = new T*;
    

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

    你可以的

    T **ptr = new T*;