2013-05-29 2 views
-4

Я пытался добавить строку в конец вектора вектора строк и как-то столкнулся с проблемой памяти.добавление строк к вектору вектора

мой код что-то похожее на это

vector<vector<string>> slist; 

.... 

slist.push_back(vector1); 
slist.push_back(vector2); 

... 

for(int i=0; i<10; i++){ 
    int length = slist.size()-1; 
    slist[length].push_back("String"); // also tried slist.back().push_back("S"); 
} 

И это, как некоторые дает мне проблему памяти

Invalid read of size 8 
==2570== at 0x404D18: std::vector<std::string, std::allocator<std::string>    >::push_back(std::string const&) (stl_vector.h:735) 
==2570== by 0x403956: main (asm.cc:400) 
==2570== Address 0xfffffffffffffff0 is not stack'd, malloc'd or (recently) free'd 
==2570== 
==2570== 
==2570== Process terminating with default action of signal 11 (SIGSEGV) 
==2570== Access not within mapped region at address 0xFFFFFFFFFFFFFFF0 
==2570== at 0x404D18: std::vector<std::string, std::allocator<std::string> >::push_back(std::string const&) (stl_vector.h:735) 
==2570== by 0x403956: main (asm.cc:400) 
==2570== 

Может кто-нибудь сказать мне, почему ??

PS: жаль предыдущий плохо задаваемый вопрос ..

+1

'slist.back()' лучше, но нам нужен SSCCE. Я не верю, что вы указали правильный код. – chris

+11

"Проблема с памятью"? Какая проблема памяти? Какую ошибку вы получаете? Вы показали нам код, который мы не можем использовать для воспроизведения проблемы, и сказали, что вы получили сообщение об ошибке, не сообщив нам, какая ошибка это *. *. Самый конкретный ответ, который я могу дать при таких обстоятельствах, - «возможно, есть способ заставить ваш код работать» – jalf

ответ

1

код, как вы дали ему works fine:

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

using namespace std; 

void print(vector<vector<string>> s) 
{ 
    cout << "Lists:" << endl; 
    for (const auto& v : s) 
    { 
     cout << "List: "; 
     for (const auto& i : v) 
     { 
      cout << i << ", "; 
     } 
     cout << endl; 
    } 
    cout << "Done" << endl; 
} 

int main() 
{ 
    vector<vector<string>> slist; 

    slist.push_back(vector<string>()); 
    slist.push_back(vector<string>()); 

    print(slist); 

    const auto length = slist.size()-1; 
    slist[length].push_back("String"); // also tried slist.back().push_back("S"); 

    print(slist); 
} 

Edit: Да, вы можете даже поставить его into a loop:

vector<vector<string>> slist; 

print(slist); 

for (auto i = 0; i < 7; ++i) 
{ 
    slist.push_back(vector<string>()); 
    for (auto j = 0; j < 5; ++j) 
    { 
     slist[i].push_back("String[" + toStr(i) + "][" + toStr(j) + "]"); // also tried slist.back().push_back("S"); 
    } 
} 

print(slist); 

Проблема, вероятно, в другом месте. Что говорит ваш отладчик?

+0

humm ... это странно ... если этот код находится в цикле for, это повлияет на результат? – user1948847

+1

@ user1948847, Действительно, опубликуйте [sscce] (http://sscce.org). Это не сложно, и это намного ценнее. – chris

+0

@ user1948847 - Ввод кода в цикл работает нормально: https://ideone.com/xgO0ty – Bill

Смежные вопросы