我的问题是我是否因为内部向量超出下面循环的范围(被破坏)而看到奇怪的程序行为
由于产生的数据量很大,很难测试,所以我想知道是否有人可以直接给我一个答案
我有一个大的(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?
我希望尽可能避免使用堆,因为我不想清理内存/处理内存泄漏。
请让我知道您的想法
由于
答案 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的向量)内存可能会碎片化,并且从操作系统的角度来看似乎没有减少,这是正常行为。
如果您有其他问题,请更准确地描述。