c++ - c++ sqlite回调函数中对象的丢失值
问题描述
这些是函数,在 fillAlbum 中构建正确的对象后,数据在openAlbum中丢失。
/*
the function will fill the album with correct values (callback function)
*/
int fillAlbum(void* data, int argc, char** argv, char** azColName)
{
Album* album = new Album();
album->setName(argv[1]);
album->setCreationDate(argv[3]);
album->setOwner(std::stoi(argv[2]));
data = album;
return 0;
}
/*
the function return the asked album
*/
Album DatabaseAccess::openAlbum(const std::string& albumName)
{
Album album;
char** errMessage = nullptr;
std::string sqlStatement = "SELECT * FROM ALBUMS WHERE NAME LIKE '" + albumName + "';";
sqlite3_exec(db_access, sqlStatement.c_str(), fillAlbum, &album, errMessage);
return album;
}
解决方案
它会丢失(实际上更糟:您有内存泄漏!)因为您没有正确使用回调。你通过了&album
,现在你必须转换指针void*
并填充它,而不是覆盖它(事实上,该data = album
行在函数之外根本没有影响fillAlbum
,你只是覆盖了一个局部变量)。试试这个:
int fillAlbum(void* data, int argc, char** argv, char** azColName)
{
Album* album = static_cast<Album*>(data); // <-- this line is crucial
album->setName(argv[1]);
album->setCreationDate(argv[3]);
album->setOwner(std::stoi(argv[2]));
return 0;
}
推荐阅读
- java - 似乎无法实例化非空 FXMLLoader
- c# - C# NTLM 认证函数
- powershell - 从许多文本文件中解析 FROM 电子邮件地址的脚本
- javascript - 替换两个字符之间的多个字符串
- python - 正则表达式模式在不验证固定宽度模式的情况下无法使用look behind
- python - 在 Python IGraph 中将顶点作为元组获取
- windows - 如何在 WinSCP 脚本中启用日志记录?
- mysql - MySQL选择以NULL分隔的数据系列之间的日期范围
- javascript - FeathersJS:在服务测试中注入 HTTP 标头
- html - 如何让两个列表项出现在页面的另一侧?