【问题标题】:Casting std::vector<std::string> to void*将 std::vector<std::string> 转换为 void*
【发布时间】:2015-07-02 18:42:21
【问题描述】:

我正在尝试将std::vector&lt;std::string&gt; 传递给void*,以便在需要将void* 传递给它的回调函数中使用。回调是 sqlite_exec 回调。但是,将vec 转换为void* 时出现段错误。那么如何将std::vector&lt;std::string&gt; 传递给这样的回调呢?

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;
}

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

【问题讨论】:

  • 但是您的代码已经正确执行了。如果这不起作用,那么你必须先解释它有什么问题。
  • 您是否收到错误或意外结果?
  • 您应该确保在调用回调函数时vec 仍然在作用域内。否则我看不出你的代码有什么问题。
  • 有什么问题?
  • @HSchmale 你没有得到那个演员的段错误,这是一个没有动作的句法语句。而且您最好使用 C++ 强制转换而不是 C 强制转换,并且您不需要将 &vec 强制转换为 void *

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


【解决方案1】:

首先,void * 专门设计用于接受指向任何数据的指针,因此不需要显式转换。第二 - 你最好在 C++ 代码中使用 C++ cast:

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

或相应地处理它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2016-01-28
    相关资源
    最近更新 更多