потерянное значение объекта в функции обратного вызова 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;
}

Всего 1 ответ


Он теряется (на самом деле это еще хуже: у вас утечка памяти!), Потому что вы неправильно используете обратный вызов. Вы передаете &album и теперь вам нужно void* указатель 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;
}

Есть идеи?

10000