我已经看到很多与此主题相关的类似问题,但是我没有看到对该问题的明确答案。考虑以下代码:
typedef struct Student
{
int id;
} Student;
vector<Student> students();
for( int i = 0; i < 10; i++ )
{
Student s();
s.id = i
students.push_back( d );
}
此向量如何分配内存?根据我的理解,每个Student s
应该在堆栈上有它的内存,并在循环迭代时取消分配,因此如果我稍后再尝试访问此数据,这应该会产生未定义的行为。但是,如果我用vector<int>
做同样的事情,它不会产生不确定的行为。
这是正确的吗?无论哪种方式,我的目标都是创建一个vector<Student>
,在其中将对象分配在堆上,而不必使用vector<Student*>
。这可能吗?
创建std::unique_ptr<Student>
...也可以使用std::vector<std::unique_ptr<Student>>
类型保存数据。这样,您不必担心通过unique_ptr删除堆存储上已分配的内存。
根据vector in cppreference,向量需要两个模板参数,它们是T(向量中元素的类型)和分配器,默认情况下将其设置为std::allocator<T>
并根据std::allocator
's allocate
function进行设置,必须由向量以分配内存:
通过调用:: operator new(std :: size_t)或:: operator new(std :: size_t,std :: align_val_t)分配n * sizeof(T)个未初始化存储的字节(从C ++ 17开始),但是未指定何时以及如何调用此函数。指针提示可用于提供引用的位置:如果实现支持,分配器将尝试分配新的内存块,使其与提示尽可能接近。
因此,每当没有给向量的分配器时,所有新成员都存储在堆中。尽管大多数分配器必须使用堆来分配内存。