【发布时间】:2014-03-19 21:22:44
【问题描述】:
我的问题是,由于内部向量超出下面循环的范围(被破坏),我是否看到了奇怪的程序行为
由于产生的数据量很大,很难测试,所以我想知道是否有人可以直接给我答案
我有一个或多个大 (STL) 向量或对,它又包含一个 int 和一个向量
vector<pair<int, vector<int>>> vectorOfmyTypes
我调整了一些数据的大小
vectorOfmyTypes.reserve(1000000)
在循环中我生成一对>,其中向量具有可变长度。我发现当我在堆栈上声明向量时,我的程序稍后会出现一些奇怪的行为,但在堆上声明它会修复它。
例如下面的代码:
while( <1000000) {
vector<int> stackVector;
stackVector.push_back(1);
vectorOfmyTypes.pushback(make_pair(1,stackVector);
}
我的印象是对象生命周期都将由 STL 矢量对象为我管理。这是不正确的吗? vectorOfmyTypes 在失去作用域时实际上是否仍然包含有效的 stackVector?
我希望尽可能避免使用堆,因为我不想清理内存/处理内存泄漏。
请告诉我你的想法
谢谢
【问题讨论】:
-
有什么问题?你如何观察它?你能提供一个SSCCE(sscce.org)吗?
-
请描述您所说的“奇怪行为”。
-
问题是(我猜是问题),用于将向量存储在向量中,在循环中创建临时向量
并将其推回向量 .当这个临时变量超出循环范围时,是否会将向量中的数据标记为空闲?没有“直接”观察到问题 - 它非常复杂,但是在堆上声明时,问题似乎消失了。 -
“当这个临时变量超出循环范围时,是否会将向量中的数据标记为空闲?”不,不是的。当您将
push_back转换为vector时,会推送一个副本。这部分代码应该没有“奇怪的行为”。 -
此外,您的
stackVector只是名称上的堆栈向量:它的数据存储在堆上。
标签: c++ vector scope heap-memory stack-memory