C ++ векторная строка for-loop push_back error - PullRequest
1 голос
/ 11 апреля 2011

Мне кажется, что это совсем просто, но по какой-то причине я не могу понять, что происходит.

Когда я запускаю эту часть своего кода, которая объединяет URL-адрес со строковыми элементами измассива, а затем помещая его в строковый вектор, он успешно выдвигает первый URL, но затем имеет место утечка памяти?Консоль бесконечно зацикливается на тарабарщине ...

string anonlist[] = {"test1","test2","test3","test4","test5","test6","test7"};


for (int i=0; i<=7; i++)
{

    vector<string> nameurl; 
    nameurl.push_back("http://api.twitter.com/1/users/show.json?screen_name="+anonlist[i]);

    cout << nameurl[i] << endl;
}

Ответы [ 4 ]

6 голосов
/ 11 апреля 2011

В массиве есть 7 элементов с индексами 0 1 2 3 4 5 6. В ваш цикл также будет включен случай, когда i = 7 выходит за границы массива.

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

string anonlist[] = {"test1","test2","test3","test4","test5","test6","test7"};

vector<string> nameurl; 
for (int i=0; i < 7; i++)
{

    nameurl.push_back("http://api.twitter.com/1/users/show.json?screen_name="+anonlist[i]);

    cout << nameurl[i] << endl;
}
1 голос
/ 11 апреля 2011

Вы создаете новый vector<string> каждый раз через цикл, вставляете один элемент, затем пытаетесь получить доступ к элементу с индексом i. Элемент с индексом i будет только в первый раз в цикле, когда i равен 0.

Предположительно, вы хотите переместить объявление nameurl за пределы цикла, чтобы один и тот же контейнер использовался для всех итераций цикла.

0 голосов
/ 11 апреля 2011

Еще один способ сделать ответ Бена:

const string anonlist[] = {"test1", "test2", "test3", "test4", "test5", "test6", "test7"};
vector<string> nameurl(sizeof(anonlist) / sizeof(anonlist[0]), "http://api.twitter.com/1/users/show.json?screen_name="); 
for (size_t i = 0; i < nameurl.size(); ++i) {
    cout << (nameurl[i] += anonlist[i]) << endl;
}

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

0 голосов
/ 11 апреля 2011

Вы создаете новый вектор каждый раз через цикл for - этот вектор имеет только область видимости блока внутри цикла for.Вы должны переместить вектор за пределы цикла.

...