对象向量是否在C ++中分配在堆或堆栈上?

问题描述 投票:0回答:2

我已经看到很多与此主题相关的类似问题,但是我没有看到对该问题的明确答案。考虑以下代码:

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*>。这可能吗?

c++ vector heap dynamic-memory-allocation
2个回答
0
投票

创建std::unique_ptr<Student> ...也可以使用std::vector<std::unique_ptr<Student>>类型保存数据。这样,您不必担心通过unique_ptr删除堆存储上已分配的内存。


0
投票

根据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开始),但是未指定何时以及如何调用此函数。指针提示可用于提供引用的位置:如果实现支持,分配器将尝试分配新的内存块,使其与提示尽可能接近。

因此,每当没有给向量的分配器时,所有新成员都存储在堆中。尽管大多数分配器必须使用堆来分配内存。

© www.soinside.com 2019 - 2024. All rights reserved.