【问题标题】:Can you declare a pointer on the heap?你能在堆上声明一个指针吗?
【发布时间】:2010-11-19 10:53:11
【问题描述】:

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

T *ptr = new T;

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

T *ptr = new T*;

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

【问题讨论】:

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

标签: c++ dynamic-memory-allocation heap-memory


【解决方案1】:
int** ppint = new int*;
*ppint = new int;

delete *ppint;
delete ppint;

【讨论】:

    【解决方案2】:

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

    T** ptr = new T*;
    

    它将驻留在堆上。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案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
        

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

        【讨论】:

          【解决方案5】:

          你做不到

          T *ptr = new T*;
          

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

          你可以的

          T **ptr = new T*;
          

          【讨论】:

            猜你喜欢
            • 2016-06-19
            • 2010-11-20
            • 2020-12-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-11
            • 1970-01-01
            • 2015-09-12
            相关资源
            最近更新 更多