对象向量是否在堆或堆栈上分配C++?
Does an object vector allocate on the heap or stack in C++?
我见过很多关于这个话题的类似问题,但我没有看到这个问题的明确答案。请考虑以下代码:
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*>
。这可能吗?
根据 cppreference 中的向量,一个向量需要两个模板参数,分别是 T(向量中元素的类型(和 分配器,默认情况下设置为std::allocator<T>
并根据std::allocator
的allocate
函数,必须由向量调用才能分配内存:
通过调用 ::运算符 new(std::size_t( 或 ::运算符 new(std::size_t, std::align_val_t( (自 C++17 起(分配 n * sizeof(T( 字节的未初始化存储,但未指定何时以及如何调用此函数。指针提示可用于提供引用的位置:如果实现支持,分配器将尝试将新内存块分配尽可能靠近提示的位置。
因此,只要没有给定的向量分配器,所有新成员都存储在堆中。尽管大多数分配器必须使用堆来分配内存。
创建std::unique_ptr<Student>
... 还可以使用std::vector<std::unique_ptr<Student>>
类型来保存数据。 这样,您就不必担心按unique_ptr删除堆存储上分配的内存。
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 使用RAII在给定次数的迭代后重新分配资源