вектор в векторе выходит за рамки

0

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

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

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

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

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

благодаря

  • 0
    В чем проблема? Как вы это наблюдаете? Можете ли вы предоставить SSCCE ( sscce.org )?
  • 0
    Пожалуйста, опишите, что вы называете "странным поведением".
Показать ещё 3 комментария
Теги:
scope
vector
stack
heap

2 ответа

0
Лучший ответ

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

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

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

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 );
}
  • 0
    поэтому в новой итерации предыдущий stackVector был бы уничтожен, и, следовательно, внутри вектора <pair <int, vector <int >> вектор <int> может быть недопустимым?
  • 0
    Имеет ли это хоть какой-то смысл?
Показать ещё 2 комментария
0

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

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

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

  • 0
    хм, может быть из-за задержки (медленное распределение). Я бы подумал, что распределение стека, однако, быстрее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню