我尝试将std::vector<std::string>
传递给void*
,以便在回调函数中使用,该函数需要传递void*
。回调是sqlite_exec
回调。但是,在将vec
投射到void*
时,我遇到了段错误。那么如何将std::vector<std::string>
传递给这样的回调?
static int cb_vector(void* vec, int argc, char**argv, char**colNm){
std::vector<std::string>* myvec = (std::vector<std::string>*)vec;
for(int i = 0; i < argc; i++){
myvec->push_back(argv[i]);
}
return 0;
}
std::vector<std::string> myfunc(){
std::vector<std::string> vec;
int rc = sqlite3_exec(_db, SQL, cb_vector, (void*)&vec, NULL);
return vec;
}
我已经查看了以下资源,但他们没有回答我的问题。
答案 0 :(得分:0)
首先void *
专门用于接受指向任何数据的指针,因此不需要显式转换。第二 - 你最好在C ++代码中使用C ++强制转换:
std::vector<std::string>* myvec = static_cast<std::vector<std::string>*>( vec );
至少在您为演员表使用关键字时更容易发现问题。
根据sqlite3_exec文件:
sqlite3_exec()回调的第三个参数是一个数组 从sqlite3_column_text()获得的字符串指针,一个用于 每一栏。如果结果行的元素为NULL,则为 sqlite3_exec()回调的相应字符串指针是NULL 指针。
您很可能会得到nullptr
并尝试将其推入vector
。在那里进行额外的检查:
myvec->push_back(argv[i] ? argv[i] : std::string() );
或相应处理