【发布时间】:2020-03-30 02:53:14
【问题描述】:
我已经看到很多关于这个主题的类似问题,但我没有看到这个问题的明确答案。考虑以下代码:
typedef struct Student
{
int id;
} Student;
vector<Student> students();
for( int i = 0; i < 10; i++ )
{
Student s();
s.id = i
students.push_back( s );
}
这个向量如何分配内存?据我了解,每个Student s 都应该在堆栈上拥有它的内存,并在循环迭代时被取消分配,所以如果我稍后尝试访问这些数据,这应该会产生未定义的行为。但是如果我用vector<int> 做同样的事情,它不会产生未定义的行为。
这是正确的吗?无论哪种方式,我的目标是创建一个vector<Student>,其中对象在堆上分配,而不必使用vector<Student*>。这可能吗?
【问题讨论】:
-
对象被复制/移动到向量中。向量处理其内存的方式,这些副本很可能在堆上。
-
请注意
vector<Student> students();声明了一个名为students的函数,它不接受任何参数并按值返回vector<Student>。删除括号以定义矢量对象。 -
students在堆栈上。它管理的内存在堆上(Student元素)。 -
@JedediahHeal “堆栈”和“堆”在物理上没有分离,它们只是同一内存的不同区域。对象被复制,而不是移动或引用。 (C++ 不是 Java。)将对象从内存的一部分复制到另一部分总是相同的。
-
从技术上讲,C++ 中根本没有“堆”和“栈”。
std::vector采用动态内存分配来管理对象集合,其中对象的数量在运行时确定。堆和堆栈描述了一些(不是全部)实现如何管理内存的细节 - 在此类系统上,动态内存分配通常使用堆内存。
标签: c++ vector heap-memory dynamic-memory-allocation