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

这个问题在这里已经有了答案:

  • 为什么C ++程序员应该尽量减少对'新'的使用? 17个答案

  • 除了你将有更大的内存块分配到指向矢量的指针之外,两者之间的区别是什么?

  • '将有更大的内存分配'
    这不一定是真的! std::vector可能会为内部管理的数据数组选择比10更大的默认初始大小。
  • '两者有什么区别'
    主要区别在于第一个分配在本地范围堆栈上,第二个分配(通常)分配到堆中。 注意:内部管理的数据数组无论如何都会进入堆中!
  • 为了确保正确的内存管理,当你真的需要使用从堆中分配的std::vector<float>*指针时,我建议使用c ++智能指针,例如:

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

    有关更多详细信息,请参阅<memory>的文档。


    关键区别之一是范围。 在你的第一个例子中,vector可能是一个类的成员,或者它是本地函数。 如果它是一个类成员,当包含对象被销毁时它将被销毁。 如果它是函数的局部函数,那么函数结束时它将被销毁。 这个对象绝对不能超出这个范围,所以如果你尝试把它的地址传递给你的程序的另一部分,你必须非常小心。

    当你在堆上手动分配一些东西时,它会存在很长时间。 您完全控制了释放,这意味着您可以在一个对象/函数中创建它,并在需要时使用或删除它。

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

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

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

    链接地址: http://www.djcxy.com/p/40643.html

    上一篇: Allocating a vector vs. a pointer to a vector

    下一篇: Why is it a bad idea to use 'new'?