вектор внутри вектора, выходящего за рамки

Мой вопрос в том, вижу ли я странное поведение программы из-за того, что внутренний вектор выходит за рамки (уничтожается) цикла ниже

Из-за количества произведенных данных их довольно сложно протестировать, поэтому мне было интересно, может ли кто-нибудь прямо дать мне ответ.

У меня есть большой (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, когда он теряет область действия?

Я хочу по возможности избегать использования кучи, так как не хочу очищать память/иметь дело с утечками памяти.

Пожалуйста, дайте мне знать, что вы думаете

Спасибо


person Prof    schedule 19.03.2014    source источник
comment
В чем проблема? Как вы это наблюдаете? Можете ли вы предоставить SSCCE (sscce.org)?   -  person Arun    schedule 20.03.2014
comment
Пожалуйста, опишите, что вы называете странным поведением.   -  person Antoine    schedule 20.03.2014
comment
Вопрос (и, я думаю, проблема) заключается в том, что для хранения вектора внутри вектора в цикле создается временный вектор‹int› и помещается обратно в вектор‹pair..›. Когда эта временная переменная выходит за пределы цикла, помечает ли это данные в векторе как свободные? Напрямую проблема не наблюдается - она ​​достаточно сложная, но при объявлении в куче проблема как бы исчезает.   -  person Prof    schedule 20.03.2014
comment
Когда эта временная переменная выходит за пределы цикла, помечает ли это данные в векторе как свободные? Нет. Когда вы push_back вставляете vector, копия помещается. Эта часть вашего кода не должна иметь странного поведения.   -  person Sergey Kalinichenko    schedule 20.03.2014
comment
Более того, ваш stackVector является вектором стека только в названии: его данные хранятся в куче.   -  person Sergey Kalinichenko    schedule 20.03.2014


Ответы (2)


В первую очередь всегда показывайте примеры кода, которые можно скомпилировать без ошибок.

Показанный вами код не имеет отношения к полученной вами ошибке.

В этом некомпилированном примере

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

время жизни локального объекта stackVector не имеет ничего общего со временем жизни элемента вектора 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 );
}
person Vlad from Moscow    schedule 19.03.2014
comment
таким образом, в новой итерации предыдущий stackVector будет уничтожен, и, следовательно, внутри вектора‹pair‹int, vector‹int››, вектор‹int› может быть недействительным? - person Prof; 20.03.2014
comment
Имеет ли это хоть какой-то смысл? - person Prof; 20.03.2014
comment
@Prof Как я уже сказал, время жизни stackVector не имеет ничего общего с новым элементом вектора vectorOfmyTypes. stackVector копируется в новый элемент vectorOfmyTypes. - person Vlad from Moscow; 20.03.2014

Поскольку в действительности нет никаких указателей, ваше предположение верно: когда вектор в стеке выходит за рамки, он уничтожается, как и все содержащиеся данные.

Но поскольку вы выделили довольно много данных небольшими порциями (многие вектора размером 1), память может стать фрагментированной и не уменьшиться с точки зрения ОС, это нормальное поведение.

Если у вас есть другая проблема, пожалуйста, опишите ее более точно.

person Antoine    schedule 19.03.2014
comment
хм, tjos ossue может быть связано с задержкой (медленным распределением). Однако я бы подумал, что распределение стека происходит быстрее. - person Prof; 20.03.2014