将std :: vector <std :: string>转换为void *

时间:2015-07-02 18:42:22

标签: c++ c++11 vector casting

我尝试将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;
}

我已经查看了以下资源,但他们没有回答我的问题。

1 个答案:

答案 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() );

或相应处理