首页 > 解决方案 > 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;
}

标签: c++sqlite

解决方案


它会丢失(实际上更糟:您有内存泄漏!)因为您没有正确使用回调。你通过了&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;
}

推荐阅读