C++ 为什么我要在堆上放一个向量?

C++ 为什么我要在堆上放一个向量?,c++,C++,为什么我要在堆上放一个向量 我经常看到这样的代码: std::vector<int> *v = new std::vector<int>(); std::vector*v=新的std::vector(); P>我唯一能想到的是,如果我想共享这个向量,那么在现代C++中,我将使用SyrdypTr.< 在堆上放置向量还有其他原因吗?我的意思是向量中的元素已经被堆分配了。一个对象应该在堆栈上还是在堆上,或者是静态的问题都是关于生命周期的。短命对象应该(通常)进入寄存器或堆

为什么我要在堆上放一个向量

我经常看到这样的代码:

std::vector<int> *v = new std::vector<int>();
std::vector*v=新的std::vector();
<> P>我唯一能想到的是,如果我想共享这个向量,那么在现代C++中,我将使用SyrdypTr.<
在堆上放置向量还有其他原因吗?我的意思是向量中的元素已经被堆分配了。

一个对象应该在堆栈上还是在堆上,或者是静态的问题都是关于生命周期的。短命对象应该(通常)进入寄存器或堆栈;堆上的长寿命的;永久性的是静态的

所以答案是肯定的,如果期望向量有较长的生命周期,但比程序的生命周期短,那么就在堆上放置一个向量

共享指针的问题仅适用于要共享的对象,这也是另一种考虑


[HT@Eric Lippert在C#的上下文中指出了这一点]

如果我们谈到C++11及更高版本,这似乎是对它的总结。请记住,前面没有移动语义,但是已经有返回值优化。如果向量是在函数中创建的,并且您希望返回向量的副本。然后在堆上分配向量并返回指向它的指针,这将允许在函数之外进行访问。如果需要多维动态数组(即
std::vector
),则只需要在堆上放置向量一般来说,这要么是一些人不了解stl容器是如何工作的,要么是因为他们想避免copy@cppcoder,如果要返回在函数中创建的向量的副本,请将返回类型设为
std::vector
。“生存期”与其说是时间,不如说是范围。如果某些内容必须在当前代码块之外继续存在,则它不能在堆栈上。除了指针的共享之外,
shared_ptr
也很有用,因为它还控制生命周期,尽管
unique_ptr
有时更合适-请再次查看作用域注释。@MarkRansom:不,作用域又不同了。作用域是程序中最大的部分,其中名称是有效的(S3.3.1),但生存期是S3.8中定义的对象的运行时属性,与S3.7中的存储持续时间有关。对象可以具有块作用域,但仍然是静态的或外部的。