【问题标题】:vector within a vector going out of scope超出范围的向量内的向量
【发布时间】: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


【解决方案1】:

首先总是展示可以无错误编译的代码示例。

您显示的代码与您得到的错误无关。

在这个未编译的例子中

while( <1000000) {
vector<int> stackVector;
stackVector.push_back(1);
vectorOfmyTypes.pushback(make_pair(1,stackVector);
}

本地对象stackVector的生命周期与使用push_back添加到向量中的向量vectorOfmyTypes的元素的生命周期没有共同点。

我只能猜测您似乎在向量中放置了一个指向本地向量的指针。在这种情况下,本地向量的生命周期确实会影响指针的验证。

例如

std::vector<std::pair<int, std::vector<int> *>> vectorOfmyTypes;

size_t i = 0;
while ( i < 1000000 ) 
{
    std::vector<int> stackVector;
    stackVector.push_back( i++ );
    vectorOfmyTypes.push_back( std::make_pair( 1, &stackVector );
}

【讨论】:

  • 所以在新的迭代中,前一个 stackVector 将被破坏,因此在 vector> 内,vector 可能无效?
  • 这样有意义吗?
  • @Prof 正如我所说,stackVector 的生命周期与向量vectorOfmyTypes 的新元素没有任何共同之处。 stackVector 被复制到vectorOfmyTypes 的新元素中。
【解决方案2】:

由于不涉及指针,因此您的假设是正确的:当堆栈上的向量超出范围时,它以及所有包含的数据都会被销毁。

但是由于您在小块(许多大小为 1 的向量)中分配了大量数据,因此内存可能会变得碎片化,并且从操作系统的角度来看似乎不会减少,这是正常行为。

如果您还有其他问题,请更准确地描述。

【讨论】:

  • 嗯,tjos ossue 可能是由于延迟(分配缓慢)。不过,我认为堆栈分配更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
相关资源
最近更新 更多