分配矢量与指向矢量的指针
这个问题在这里已经有了答案:
除了你将有更大的内存块分配到指向矢量的指针之外,两者之间的区别是什么?
这不一定是真的!
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