gpt4 book ai didi

c++ - 在类中存储指向 sqlite3 数据库的指针会引发段错误

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:41 26 4
gpt4 key购买 nike

在我的程序中,我使用的是 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);
}

然而,sqlite3_open()sqlite3_close()当我尝试在 mConfig->getDatabase() 上调用它们时,函数出现段错误.

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

--------编辑:我忘了包含获取/设置数据库函数:

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;

  • 一样微不足道
  • 考虑将数据库指针(和任何其他托管资源)包装到一个仅负责管理此资源的帮助程序类中。一种可能的解决方案是使用自定义删除器的 shared_ptr

关于c++ - 在类中存储指向 sqlite3 数据库的指针会引发段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56902900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com