Мой вопрос заключается в том, вижу ли я странное поведение программы из-за того, что внутренний вектор выходит из области действия (будучи уничтожен) цикла ниже
Из-за количества данных, которые вы получили, достаточно сложно проверить, так что мне было интересно, может ли кто-нибудь прямо ответить мне
У меня есть большой (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 по-прежнему содержит допустимый стек, когда он теряет область видимости?
Я хочу избежать использования кучи, насколько это возможно, поскольку я не хочу, чтобы очищать память/работать с утечками памяти.
Пожалуйста, дай мне знать, что ты думаешь
благодаря
Прежде всего, всегда показывайте примеры кода, которые могут быть скомпилированы без ошибок.
Код, который вы показали, не имеет отношения к полученной вами ошибке.
В этом некомпилированном примере
while( <1000000) {
vector<int> stackVector;
stackVector.push_back(1);
vectorOfmyTypes.pushback(make_pair(1,stackVector);
}
время жизни локального объекта stackVector
имеет ничего общего с lfetime элемента вектора vectorOfmyTypes
который добавляется к вектору с помощью push_back..
Я только могу догадаться, что кажется, что вы поместили в вектор указатель на локальный вектор. В этом случае на самом деле время жизни локального вектора повлияло на проверку указателя.
Например
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), то память может стать фрагментированной и, по-видимому, не уменьшиться с точки зрения ОС, это нормальное поведение.
Если у вас есть другая проблема, пожалуйста, опишите ее более точно.