将指针存储到SQLITE3数据库中的类别抛出segfault
Storing Pointer to sqlite3 Database inside class throws segfault
在我的程序中,我使用的是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
。
相关文章:
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- C++中带有List类的迭代器Segfault
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用Vulkan hpp vk::enumerateInstanceVersion()会导致segfault
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 添加存储在向量中的大整数的函数出现问题
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 在std::vector上存储带有模板的类实例
- 将指针存储到SQLITE3数据库中的类别抛出segfault
- 获取用户存储segfault错误