以下代码在堆栈上会发生什么?
具体来说我认为temp应该存储在堆栈上吗?
然后当temp被重新分配给一个新的空置向量时,包含2和3的前一个temp怎么样?
它不再在堆栈中被删除了吗?
谁删除了?
int main() {
vector<int> temp;
temp.push_back(2);
temp.push_back(3);
temp = vector<int>();
}
答案 0 :(得分:1)
一步一步。
int main() {
vector<int> temp;
上面一行创建了vector<int>
类型的局部变量。 vector
类的成员生活在堆栈中。
vector
创建可以在堆上分配默认的int
。 (注意:vector
类可能会等待第一个push_back
以便在堆上进行分配。)
temp.push_back(2);
如果需要,向量在堆上分配默认值int
该参数被复制到第一个插槽中(在堆上)
向量中的状态变量已更新
堆栈上的空间分配不会更改。
temp.push_back(3);
向量将值3放入堆上分配的内存的第二个插槽中 向量中的状态变量已更新 堆栈上的空间分配不会更改。
temp = vector<int>();
temp
被分配给一个新的向量
堆上的旧向量值被取消分配
向量中的状态变量已更新
堆栈上的空间分配不会更改。
}
从堆栈中移除temp
向量(调用其析构函数)
堆栈应与执行main
之前的大小相同。
vector的析构函数删除它从堆中分配的内存。
编辑1:
注意:矢量元素的存储取决于实现。向量可以将其数据存储在堆栈中(例如,类中的元素具有默认区域)。常见的实现是将堆用于元素。