在堆上创建指针是否有用?

时间:2016-04-21 18:45:16

标签: c++ pointers

在堆上创建指针或指针数组是否有用?如果是的话何时以及为什么我需要这样做?

例如:

#include <iostream>

class Box { /*  things... */ };

int main(void){

    // Single pointer on the heap
    Box** pBox = new Box*(nullptr);
    *pBox = new Box();

    // Array of pointers on the heap
    Box** pBoxes = new Box*[3]{};
    pBoxes[0] = new Box();
    pBoxes[1] = new Box();
    pBoxes[2] = new Box();

    // Delete pointers...

    return 0;
}
编辑:只是为了让我的问题更清楚......我知道处理原始指针并不是最好的做法...我只想完全理解指针及其用途,因为它们是c ++的重要组成部分,因此我的问题是(这很有用......)。

4 个答案:

答案 0 :(得分:3)

在堆上或堆栈上分配任何内存空间背后的原因与分配的变量类型无关,它与它的分配方式以及它的含义有何关系使用。

在任何情况下,现在您通常应该避免new语句并使用&#34; managed&#34;指针,特别是std::xxx变体。

答案 1 :(得分:2)

从我读到的,堆的访问速度比堆栈慢,所以,我不认为做你正在谈论的内容非常有用。 也许这会帮助你进行研究:http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

答案 2 :(得分:2)

正如另一个回答所提到的,通常对堆的实际访问速度比访问堆栈要慢,但访问速度通常不是创建和处理指针的原因。

指针的典型用例是避免复制数据。当你处理大型对象并在许多函数之间传递它们时,通过引用而不是按值传递它会被认为是“更好”。

如果您使用堆栈中的对象(除非您将其作为引用传递,但在执行此操作时存在限制),它会为被调用方法复制整个事物。将指针传递给方法时,它只复制一个地址。

查看this article是否有助于您了解差异。

答案 3 :(得分:0)

是的,可能有理由在堆上有指针。跟踪其创建的每个对象的工厂函数可以将它们存储在向量中,例如:

vector<unique_ptr<Box>> BoxFactory::allBoxes;

Box* BoxFactory::makeBox()
{
    allBoxes.emplace_back(make_unique<Box>());
    return allBoxes.back().get();
}

注意:有些人建议这不是双重间接。它是:

// Accesses some_box_member of the first Box.
allBoxes.data()->get()->some_box_member

就像OP的例子一样,你有两个指针,而不仅仅是一个。向量包含已在堆上分配的指针,这些指针包含另一个指向Box对象的指针。