关于c ++:分配向量与指向向量的指针

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字节,在大多数情况下可以忽略不计。