C++ c+中对象的丢失值+;sqlite回调函数

C++ c+中对象的丢失值+;sqlite回调函数,c++,sqlite,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[

这些函数是在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(数据);//集合名(argv[1]);
专辑->setCreationDate(argv[3]);
专辑->设置所有者(std::stoi(argv[2]);
返回0;
}

< /代码>请为C++代码和SQLite数据库两者做一个。阅读sqlite标记信息以了解如何使用。分配给函数的(非引用)参数-
data=album-在功能之外没有影响。指针没有什么特别之处。如果您想将查询结果用于打印以外的任何内容,请使用a而不是
sqlite3\u exec()
。@Shawn确实。。。我的新专辑名为《代码》;放下相册--(必选)。@TripeHound由Bobby Tables生产?