Это совсем не ошибка в отношении sqlite, это просто неинициализированный указатель. Давайте посмотрим на соответствующий код:
struct ConnIDs{
vector<int*> *ids;
};
...
ConnIDs first;
rc = sqlite3_exec(db, pSQL2[0], callback, &first, &szErrMsg);
...
static int callback(void *NotUsed, int argc, char **argv, char **szColName)
{
ConnIDs *first=(ConnIDs *)NotUsed;
for(int i = 0; i < argc; i++)
if (strcmp(szColName[i], "ConnID") == 0)
first->ids->push_back(argv[i]);
}
Я опустил ненужные части. first
- это объект ConnIDs
, который является std::vector<int*>*
- это указатель на вектор. Вы передаете first
в ваш callback
, а затем сразу же пытаетесь сделать pu sh в ids
; однако, вы не инициализировали ids
, поэтому он просто указывает на rubbi sh.
Самое простое решение - просто не делать его std::vector<int*>*
, а вместо этого просто делать std::vector<int*>
, хотя Я не уверен, int*
является правильным типом здесь, это будет действительно зависеть от данных в вашей базе данных. Я полагаю, что int
или std::string
могут быть более применимыми, но я оставлю это вам:
С вышеуказанным изменением ваш код будет работать как есть, но вам нужно будет изменить first->ids->push_back
на first->ids.push_back
Дополнительные примечания:
char *pSQL2[1];
pSQL2[0] = "Select * from Subscribers";
rc = sqlite3_exec(db, pSQL2[0], callback, &first, &szErrMsg);
Это довольно странно. Я бы, наверное, просто написал rc = sqlite3_exec(db, "Select * from Subscribers", ...)
или
auto query = "Select * from Subscribers";
rc = sqlite3_exec(db, query.c_str(), callback, &first, &szErrMsg);