分配一个向量 vs. 分配一个指向向量的指针

23 浏览
0 Comments

分配一个向量 vs. 分配一个指向向量的指针

这个问题已经有了答案

为什么C++程序员应该尽量少使用\'new\'?

我有两组代码:

std::vectorv1;

std::vector *pV2 = new std::vector(10);

两者之间的区别是什么,除了用指向向量的指针分配更多的内存块之外?一种方法是否比另一种更有优势?

在我看来,分配指针只是更麻烦,因为后来还必须要处理取消分配。

admin 更改状态以发布 2023年5月22日
0
0 Comments

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

如果你手动分配了堆上的东西,它将会一直存在。你完全掌控解除分配,这意味着你可以在创建对象/函数中创建它,并在你需要的时候在另一个对象/函数中使用或删除它。

在某些情况下,能够推迟一个对象实例化直到它被实际需要是非常有用的。例如,它可能需要不同的构造参数取决于用户输入,或者你可能想利用多态(即在运行时决定要实例化哪个子类)。

对于某些情况来说,另一个关键的差异是可用的内存。如果你将一个对象创建在函数本地,它将驻留在栈上。栈上可用的空间比堆上少得多,所以在使用特别大的对象时你可能会遇到困难(虽然这在向量上不会发生,因为它在内部分配在堆上)。

值得注意的是,对象实际使用的内存量是相同的,无论它是在栈上还是在堆上。唯一的区别是,如果你手动分配了一些堆上的东西,那么你也将拥有一个指向它的指针。尽管在大多数情况下这只是额外的 4 或 8 个字节,但其实际影响是微不足道的。

0
0 Comments

除了使用 vector 指针会分配更大的内存块之外,它们之间有什么区别?\n\n1. 拥有更大的内存块不一定正确!std::vector 可能会为内部管理的数据数组选择比 10 大得多的默认初始大小。\n\n2. 它们之间的主要区别是第一个被分配在局部作用域栈上,第二个 (通常) 存储在堆上。请注意:内部管理的数据数组无论如何都会存储在堆上!\n\n当您确实需要使用从堆分配的 std::vector* 指针时,为确保正确的内存管理,建议使用 C++ 智能指针,例如:\n\n

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

\n\n如需更多详细信息,请查看 的文档。

0