矢量内的矢量走出范围

时间:2014-03-19 21:22:44

标签: c++ vector scope stack heap

我的问题是我是否因为内部向量超出下面循环的范围(被破坏)而看到奇怪的程序行为

由于产生的数据量很大,很难测试,所以我想知道是否有人可以直接给我一个答案

我有一个大的(STL)向量或对,它们又包含一个int和一个向量

vector<pair<int, vector<int>>> vectorOfmyTypes

我调整了一些数据

vectorOfmyTypes.reserve(1000000)

在循环内部,我生成一对&gt;,其中向量具有可变长度。我发现当我在堆栈上声明向量时,我在程序中稍后会出现一些奇怪的行为,但是在堆上声明它会修复它。

例如,下面的代码:

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

我的印象是,STL矢量对象将为我管理对象生命周期。这是不正确的? vectorOfmyTypes在失去范围时是否仍然包含有效的stackVector?

我希望尽可能避免使用堆,因为我不想清理内存/处理内存泄漏。

请让我知道您的想法

由于

2 个答案:

答案 0 :(得分:0)

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

你所展示的代码与你得到的错误无关。

在这个未编译的例子中

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

本地对象stackVector的生命周期与使用push_back添加到向量的向量vectorOfmyTypes元素的lfetime没有任何共同之处。

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

例如

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 );
}

答案 1 :(得分:0)

由于没有涉及指针确实你的假设是正确的:当堆栈上的向量超出范围时,它被破坏,以及所有包含的数据。

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

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