Allocating a vector vs. a pointer to a vector
假设我有两套代码,
1 | std::vector<float>v1; |
和
1 | std::vector<float> *pV2 = new std::vector<float>(10); |
这两者之间的区别是什么,除了你将有一个更大的内存块与指向向量的指针一起分配之外?一个对另一个有优势吗?
在我看来,分配指针似乎更麻烦,因为稍后必须处理释放指针的问题。
What is the difference between the two other than the fact that you will have a larger chunk of memory allocated with the pointer to the vector?
< /块引用>
'将分配更大的内存块'这不一定是真的! std::vector 可能为内部管理的数据数组选择比10 大得多的默认初始大小。"这两者有什么区别"主要区别在于第一个分配在本地作用域堆栈上,第二个(通常)是堆。注意:内部管理的数据数组无论如何都会转到堆中!! 为了确保正确的内存管理,当您真的必须使用从堆分配的EDCOX1×2指针时,我建议使用C++智能指针,例如:
1 std::unique_ptr<std::vector<float> > pV2(new std::vector<float>(10));有关更多详细信息,请参阅
的文档。 其中一个关键的区别是范围。在第一个示例中,向量可能是类的成员,也可能是函数的局部。如果它是类成员,则当包含对象被销毁时,它将被销毁。如果它是一个函数的局部,那么当函数结束时,它将被销毁。对象绝对不可能存在于此之外,因此如果尝试将其地址传递到程序的另一部分,则必须非常小心。
当您在堆上手动分配某个东西时,它将在您想要的时间内存在。您完全控制释放,这意味着您可以在一个对象/函数中创建它,并在需要时在另一个对象/函数中使用或删除它。
在各种情况下,能够将对象的实例化延迟到实际需要时,这也是非常有用的。例如,根据用户输入,它可能需要不同的构造参数,或者您可能希望利用多态性(即,在运行时决定要实例化哪个子类)。
在某些情况下,另一个关键区别是可用内存。如果您在一个函数的本地创建一个对象,它将驻留在堆栈上。堆栈上的可用空间比堆上的可用空间小得多,因此在使用特别大的对象时可能会遇到困难(尽管向量不会发生这种情况,因为它无论如何都会在堆内部进行分配)。
值得注意的是,对象实际使用的内存量是相同的,无论是在堆栈上还是在堆上。唯一的区别是,如果您在堆上手动分配一些东西,那么您还将拥有指向它的指针。不过,这只是一个额外的4或8字节,在大多数情况下可以忽略不计。