【发布时间】:2016-01-07 10:11:08
【问题描述】:
我正在为 sqlite3 编写一个包装类,只有 4 种乐趣和学习 c++11 和 gtest。我用 gtest 测试我的包装器。在一个特定的测试用例中,我需要一个 sqlite3_value 对象来比较我的函数结果。我不知道如何从头开始创建 sqlite3_value 对象。我搜索了互联网并找到了这个解决方案:
sqlite3 *tmpDB;
sqlite3_open_v2(":memory", &tmpDB, SQLITE_OPEN_READWRITE, 0);
sqlite3_stmt *tmpStmt = nullptr;
sqlite3_prepare_v2(tmpDB, "SELECT ?;", 9, &tmpStmt, nullptr);
sqlite3_bind_text(tmpStmt, 0, "paul", 4, SQLITE_TRANSIENT);
int res = sqlite3_step(tmpStmt);
std::string s(reinterpret_cast<const char*>(sqlite3_value_text(sqlite3_column_value(tmpStmt, 0)))); /*Here throws the exception below*/
sqlite3_finalize(tmpStmt);
在调用 sqlite3_finalize() 之前进行字符串构造时会抛出以下异常:
C++ exception with description "basic_string::_M_construct null not valid" thrown in the test body.
我尝试了堆栈溢出的解决方案: Stack Overflow std::basic_string solution 但我有同样的例外。
我不确定是否可以从头开始构建 sqlite3_value。我尝试“构建” sqlite3_value 的方式是正确的吗?
也许我必须考虑使用其他类型作为 std::string。我读到了一些原因,例如 std::string 不支持文本女巫不是普通的 ACSII。对吗?
有什么建议吗?
【问题讨论】:
标签: c++ sqlite googletest