C++ multimap‹int, vector‹string›› проблема выделения памяти

Мне интересно, как решить эту проблему, когда векторы (vec, vec2) уничтожаются после выхода из storeData(), что вызывает ошибку сегментации в main(). Должен ли я выделять память для каждого вектора (vec, vec2)? Если да, то как лучше всего это сделать? Кроме того, как я мог удалить их после? Спасибо.

#include <map>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

void storeData();

multimap<int, vector<string> > mypairs;

void storeData()
{
    vector<string> vec;
    vec.push_back("one");
    vec.push_back("two");

    vector<string> vec2;
    vec2.push_back("alpha");
    vec2.push_back("beta");

    mypairs.insert(make_pair(1, vec));
    mypairs.insert(make_pair(2, vec2));
}

int main(int, char**)
{
    storeData();

    string str;
    vector<string>::const_iterator it;
    multimap<int, vector<string> >::const_iterator res;
    res = mypairs.find(1);
    for(it = res->second.begin(); it < res->second.end(); it++) {
        str = *it;
    }
    //use string str to do something else later...
}

person user3097451    schedule 13.12.2013    source источник
comment
Я не вижу проблем с памятью в этом фрагменте кода. Возможно, проблема в другом месте вашего кода?   -  person David Brown    schedule 14.12.2013
comment
Эта программа не работает с GCC 4.7.2.   -  person    schedule 14.12.2013
comment
Вы должны проверить итератор, возвращенный из mypairs.find(1), если он возвращает итератор end(). В данном случае это работает, так что проблема не в коде, который вы показали, точно так же, как вчера, когда вы задавали этот вопрос.   -  person Blastfurnace    schedule 14.12.2013
comment
@Blastfurnace Спасибо.   -  person user3097451    schedule 14.12.2013


Ответы (1)


vec и vec2 будут скопированы в mypairs, поэтому уничтожение исходных объектов не имеет значения.

Вы должны опубликовать больше информации о segfault.

person Tom Dalling    schedule 14.12.2013
comment
итераторная вставка (const value_type & x), вместо этого вставка просто отправит ссылку на мои пары? - person user3097451; 14.12.2013
comment
Контейнеры стандартной библиотеки @ user3097451 содержат значения, а не ссылки. Функция просто берет его по ссылке, чтобы избежать ненужных копий. Кроме того, параметр является постоянной ссылкой, поэтому, если он вставил только ссылку, вы никогда не сможете ее изменить, поскольку она является константой. - person David Brown; 14.12.2013
comment
@DavidBrown, есть ли способ повторно использовать строки внутри вектора? - person user3097451; 14.12.2013
comment
@ user3097451 что вы подразумеваете под повторным использованием и какие строки в каком векторе? Было бы полезно, если бы вы опубликовали код, демонстрирующий проблему, с которой вы столкнулись, поскольку опубликованный вами код выглядит нормально. - person David Brown; 14.12.2013