Указатели хороши, но содержимое памяти, на которую они указывают, вероятно, изменилось (например, здесь: https://sqlite.org/capi3ref.html#sqlite3_column_blob вы можете прочитать, что возвращенный указатель действителен только в течение некоторого времени).
В общем, избегайте использования сырых указателей в C ++. В этом случае вы можете просто использовать std :: string для копирования данных, предоставляемых sqlite.
Сравните этот код, который вносит несколько небольших изменений, чтобы избежать ручного управления памятью и необработанных указателей:
struct SourceDir
{
int id;
std::string alias;
std::string description;
std::string path;
};
std::vector<SourceDir> source_dirs;
while ((step = sqlite3_step(stmt)) != SQLITE_DONE) {
if (step != SQLITE_ROW) {
std::cerr << "[ERROR] internal error (SQLite error code" << step << ")\n";
exit(1);
}
source_dirs.emplace_back();
auto& sourceDir = source_dirs.back();
sourceDir.id = sqlite3_column_int(stmt, 0);
sourceDir.alias = sqlite3_column_text(stmt, 1);
sourceDir.path = sqlite3_column_text(stmt, 2);
sourceDir.description = sqlite3_column_text(stmt, 3);
}
for (const auto& s : source_dirs)
{
std::cerr << s.description << "\n";
}