分配向量与指向向量的指针

时间:2014-02-14 00:29:19

标签: c++ pointers vector

假设我有两组代码,

std::vector<float>v1;

std::vector<float> *pV2 = new std::vector<float>(10);

除了使用指向向量的指针分配更大的内存块之外,还有什么区别?一个对另一个有优势吗?

在我看来,似乎分配指针只是一个麻烦,因为你必须处理以后解除分配。

2 个答案:

答案 0 :(得分:1)

  
    

除了使用指向vector的指针分配更大的内存块之外,还有什么区别呢?

  
  1. '将分配更大的内存块
    这不一定是真的! std::vector可能会为内部托管数据阵列选择比10更大的默认初始大小。
  2. '两个'之间有什么区别 主要区别在于第一个在本地范围堆栈上分配, 第二个(通常)进入堆。 注意:无论如何,内部管理的数据阵列都会进入堆!!
  3. 为了确保在必须使用从堆分配的std::vector<float>*指针时进行适当的内存管理,我建议使用智能指针,例如:

    std::unique_ptr<std::vector<float> > pV2(new std::vector<float>(10));
    

    有关详细信息,请查看<memory>的文档。

答案 1 :(得分:0)

其中一个关键区别是范围。在第一个示例中,向量可能是类的成员,也可能是函数的本地成员。如果它是类成员,则在销毁包含对象时将销毁它。如果它是函数的本地函数,它将在函数结束时被销毁。该对象绝对不能存在,所以如果你尝试将其地址传递给程序的另一部分,你必须非常小心。

当您在堆上手动分配某些内容时,它将根据您的需要存在。您可以完全控制释放,这意味着您可以在一个对象/函数中创建它,并在需要时在另一个对象/函数中使用或删除它。

在各种情况下,能够延迟对象的实例化直到实际需要它才是非常有用的。例如,根据用户输入,它可能需要不同的构造参数,或者您可能希望利用多态性(即在运行时决定实例化哪个子类)。

某些情况的另一个关键区别是可用内存。如果在本地为函数创建对象,它将驻留在堆栈上。堆栈上的可用空间比堆上的空间少得多,因此在使用特别大的对象时可能会遇到困难(尽管对于向量不会发生这种情况,因为它无论如何都会在内部分配)。

值得注意的是,对象使用的实际内存量是相同的,无论是在堆栈上还是在堆上。唯一的区别是,如果你在堆上手动分配一些东西,那么你也会有一个指向它的指针。这只是额外的4或8个字节,在大多数情况下可以忽略不计。