将指针存储到SQLITE3数据库中的类别抛出segfault

Storing Pointer to sqlite3 Database inside class throws segfault

本文关键字:segfault 存储 指针 SQLITE3 数据库      更新时间:2023-10-16

在我的程序中,我使用的是sqlite3数据库。

为了处理CTRL-C信号并通过关闭数据库并关闭所有MIDI端口(我的程序使用RTMIDI(来优雅地终止程序,我需要设置一个存储它们的全局对象。我上了一堂课:

class Config {
private:
    sqlite3 *Database;
    RtMidiIn *MidiIn;
    RtMidiOut *MidiOut;
public:     
    sqlite3 *getDatabase();
    void setDatabase(sqlite3 *mDatabase);
    RtMidiIn *getMidiInStream();
    void setMidiInStream(RtMidiIn *mMidiIn);
    RtMidiOut *getMidiOutStream();
    void setMidiOutStream(RtMidiOut *mMidiOut);
    Config();
    ~Config();
};

构造函数:

Config::Config() {
    //open the midi i/o ports (irrelevant to the problem at hand)
    sqlite3 *mDatabase = this->Database;
    if (sqlite3_open(FILE_DATABASE, &mDatabase)) {
        puts(ERROR_MESSAGE_DATABASE_OPEN_FAIL);
        puts(sqlite3_errmsg(this->Database));
    }
    puts(NOTE_MESSAGE_DATABASE_OPEN);
}

但是,当我尝试在mConfig->getDatabase()上调用它们时,sqlite3_open()sqlite3_close()函数正在给我Segfaults。

我尝试将字段公开并传递mConfig->Database,这一切都没有改变。如何将数据库存储在配置类中?

---------编辑:我忘了包括get/set数据库函数:

sqlite3 *Config::getDatabase() { return this->Database; }
void Config::setDatabase(sqlite3 *mDatabase) { this->Database = mDatabase; }

这肯定是错误的:

sqlite3 *mDatabase = this->Database;
if (sqlite3_open(FILE_DATABASE, &mDatabase)) {

sqlite_open调用修改了本地mDatabase,但Config::Database仍未修改。

建议:

  • 初始化POD类型。在现代C 中,这与sqlite3 *Database = nullptr;

  • 一样微不足道
  • 考虑将数据库指针(以及任何其他托管的Ressource(包装到仅用于管理此ressource的辅助类中。一种可能的解决方案是带有自定义eleter的shared_ptr