2015-02-13 2 views
0

Некоторая часть моего кода приведена ниже. Здесь m_out определяется как: static_cast<std::vector<std::vector<std::string> >* m_out;Как преобразовать void * в std :: vector <std :: vector <std::string>> *?

Проблема в данной строке m_out->push_back(row);. Я получаю «Ошибка сегментации (core dumped)», и когда я отлаживаю, я обнаружил причину в данной строке выше. Я предполагаю, что это связано с тем, что для m_out не выделяется память. Если да, то как я могу выделить память для данного двумерного вектора?

int some_space::database::callback(void* data, int argc, char** argv, char** col_name) 
{ 
    if(m_out != 0) { 
     m_out->clear(); 
    } 
    m_out = static_cast<std::vector<std::vector<std::string> >*>(data); 
    std::vector<std::string> row; 
    for(int i = 0; i < argc; ++i){ 
     row.push_back(argv[i] ? argv[i] : "(NULL)"); 
    } 
    m_out->push_back(row); 
    return 0; 
} 

Спасибо всем. Я решил свою проблему. Я изменил код следующим образом. Теперь m_out является переменной, а не указателем static_cast<std::vector<std::vector<std::string> > m_out;.

int some_space::database::callback(void* data, int argc, char** argv, char** col_name) 
{ 
    if(m_out.size() != 0) { 
     m_out.clear(); 
    } 
    for(int i = 0; i < 6; i++) { 
     m_out.push_back(std::vector<std::string>()); 
    } 
    for(int i = 0; i < argc; ++i) { 
     m_out[i].push_back(std::string((char *)argv[i] ? argv[i] : "(NULL)")); 
    } 
    return 0; 
} 

И это работает отлично :)

+0

Вы не скажете, какую ошибку вы получите ... – sth

+0

Что такое 'm_out'? Где ваш минимальный тест? –

+0

Я получаю «segmentation fault» на линии: m_out-> push_back (строка); –

ответ

0

С броском вы утверждаете, что data указывает на вектор. Если это не так, это не сработает.

Необходимо сначала создать вектор и убедиться, что указатель на него будет передан как data (откуда бы это ни исходило). Например, он может выглядеть примерно так:

db.set_callback_data(new std::vector<std::vector<std::string> >); 
+0

Надеюсь, это не похоже на то, что это утечка ... но я понимаю, что это пример. –

+0

Ну, что просить OP - это либо утечка, либо доступ к единичной памяти;) –

+1

@EdS. Не обязательно - обратный вызов сохраняет указатель в 'm_out', поэтому он может быть освобожден позже. Тем не менее, я согласен, что это довольно плохой способ управлять временем жизни объекта. – MooseBoys

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