потерянное значение объекта в функции обратного вызова C ++ sqlite - PullRequest
0 голосов
/ 24 марта 2020

это функции, после построения правильного объекта внутри 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 Ответ

1 голос
/ 24 марта 2020

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